diff options
author | unknown <sasha@mysql.sashanet.com> | 2001-01-18 17:36:20 -0700 |
---|---|---|
committer | unknown <sasha@mysql.sashanet.com> | 2001-01-18 17:36:20 -0700 |
commit | 1ad779d47c5e7b1e4e044053f9fa8bca71ac9e2b (patch) | |
tree | 6be6f043d9869e97211581cece15de29cc37352f | |
parent | c862fa36467651ef3e3cb3acad61e42fc0b3e07c (diff) | |
download | mariadb-git-1ad779d47c5e7b1e4e044053f9fa8bca71ac9e2b.tar.gz |
fixed buffer overrun in resolve_stack_dump
fixes for restore table
test case for backup/restore
extra/resolve_stack_dump.c:
fixed buffer overrun
mysql-test/t/rpl000004.test:
updated load table from master test case
sql/ha_myisam.cc:
verbose error messages during backup table, very silent repair on restore
sql/sql_table.cc:
fixed bugs in restore table
-rw-r--r-- | extra/resolve_stack_dump.c | 8 | ||||
-rw-r--r-- | mysql-test/r/backup.result | 39 | ||||
-rw-r--r-- | mysql-test/t/backup.test | 31 | ||||
-rw-r--r-- | mysql-test/t/rpl000004.test | 2 | ||||
-rw-r--r-- | sql/ha_myisam.cc | 39 | ||||
-rw-r--r-- | sql/sql_table.cc | 10 |
6 files changed, 116 insertions, 13 deletions
diff --git a/extra/resolve_stack_dump.c b/extra/resolve_stack_dump.c index 798c9618c66..5bfdd22f8fc 100644 --- a/extra/resolve_stack_dump.c +++ b/extra/resolve_stack_dump.c @@ -159,7 +159,7 @@ static uchar hex_val(char c) l = tolower(c); if(l < 'a' || l > 'f') return HEX_INVALID; - return 10 + c - 'a'; + return (uchar)10 + ((uchar)c - (uchar)'a'); } static my_long_addr_t read_addr(char** buf) @@ -189,7 +189,7 @@ static int init_sym_entry(SYM_ENTRY* se, char* buf) /* empty - skip more space */; --buf; /* now we are on the symbol */ - for(p = se->symbol, p_end = se->symbol + sizeof(se->symbol); + for(p = se->symbol, p_end = se->symbol + sizeof(se->symbol) - 1; *buf != '\n' && *buf; ++buf,++p ) { if(p < p_end) @@ -203,7 +203,7 @@ static int init_sym_entry(SYM_ENTRY* se, char* buf) static void init_sym_table() { - char buf[256]; + char buf[512]; if(init_dynamic_array(&sym_table, sizeof(SYM_ENTRY), INIT_SYM_TABLE, INC_SYM_TABLE)) die("Failed in init_dynamic_array() -- looks like out of memory problem"); @@ -236,7 +236,7 @@ static void verify_sort() get_dynamic(&sym_table, (gptr)&se, i); if(se.addr < last) die("sym table does not appear to be sorted, did you forget \ ---numeric-sort arg to nm"); +--numeric-sort arg to nm? trouble addr = %p, last = %p", se.addr, last); last = se.addr; } } diff --git a/mysql-test/r/backup.result b/mysql-test/r/backup.result new file mode 100644 index 00000000000..a801e1cd28d --- /dev/null +++ b/mysql-test/r/backup.result @@ -0,0 +1,39 @@ +Table Op Msg_type Msg_text +t1 backup error Failed copying .frm file: errno = 2 +test.t1 backup status Operation failed +Table Op Msg_type Msg_text +test.t1 backup status OK +Table Op Msg_type Msg_text +test.t1 restore status OK +count(*) +0 +Table Op Msg_type Msg_text +test.t1 backup status OK +Table Op Msg_type Msg_text +t1 restore error Failed copying .frm file +Table Op Msg_type Msg_text +test.t1 restore status OK +n +23 +45 +67 +Table Op Msg_type Msg_text +test.t1 backup status OK +test.t2 backup status OK +test.t3 backup status OK +Table Op Msg_type Msg_text +test.t1 restore status OK +test.t2 restore status OK +test.t3 restore status OK +n +23 +45 +67 +m +123 +145 +167 +k +223 +245 +267 diff --git a/mysql-test/t/backup.test b/mysql-test/t/backup.test new file mode 100644 index 00000000000..396576badb7 --- /dev/null +++ b/mysql-test/t/backup.test @@ -0,0 +1,31 @@ +connect (con1,localhost,root,,test,0,mysql-master.sock); +connect (con2,localhost,root,,test,0,mysql-master.sock); +connection con1; +set SQL_LOG_BIN=0; +drop table if exists t1; +create table t1(n int); +backup table t1 to '../bogus'; +backup table t1 to '../tmp'; +drop table t1; +restore table t1 from '../tmp'; +select count(*) from t1; +insert into t1 values (23),(45),(67); +backup table t1 to '../tmp'; +drop table t1; +restore table t1 from '../bogus'; +restore table t1 from '../tmp'; +select n from t1; +create table t2(m int not null primary key); +create table t3(k int not null primary key); +insert into t2 values (123),(145),(167); +insert into t3 values (223),(245),(267); +backup table t1,t2,t3 to '../tmp'; +drop table t1,t2,t3; +restore table t1,t2,t3 from '../tmp'; +select n from t1; +select m from t2; +select k from t3; +drop table t1,t2,t3; +#restore table t1 from '../tmp'; +#connection con2; +#lock tables t1 write; diff --git a/mysql-test/t/rpl000004.test b/mysql-test/t/rpl000004.test index c530b434d8d..5b2c41293a2 100644 --- a/mysql-test/t/rpl000004.test +++ b/mysql-test/t/rpl000004.test @@ -8,7 +8,7 @@ load data infile '../../std_data/words.dat' into table t1; drop table if exists t2; create table t2 (word char(20) not null); load data infile '../../std_data/words.dat' into table t2; -create table t3 (word char(20) not null); +create table t3 (word char(20) not null primary key); connection slave; use test; drop table if exists t1; diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc index 7e6c4a697fa..ac88c802949 100644 --- a/sql/ha_myisam.cc +++ b/sql/ha_myisam.cc @@ -375,6 +375,7 @@ int ha_myisam::restore(THD* thd, HA_CHECK_OPT *check_opt) tmp_check_opt.init(); tmp_check_opt.quick = 1; + tmp_check_opt.flags |= T_VERY_SILENT; return repair(thd, &tmp_check_opt); err: @@ -396,24 +397,52 @@ int ha_myisam::backup(THD* thd, HA_CHECK_OPT *check_opt) char* backup_dir = thd->lex.backup_dir; char src_path[FN_REFLEN], dst_path[FN_REFLEN]; char* table_name = table->real_name; + int error = 0; + const char* errmsg = ""; + if (!fn_format(dst_path, table_name, backup_dir, reg_ext, 4 + 64)) - return HA_ADMIN_INVALID; + { + errmsg = "failed in fn_format() for .frm file: errno=%d"; + error = HA_ADMIN_INVALID; + goto err; + } + if (my_copy(fn_format(src_path, table->path,"", reg_ext, 4), dst_path, MYF(MY_WME | MY_HOLD_ORIGINAL_MODES ))) { - return HA_ADMIN_FAILED; + error = HA_ADMIN_FAILED; + errmsg = "Failed copying .frm file: errno = %d"; + goto err; } if (!fn_format(dst_path, table_name, backup_dir, MI_NAME_DEXT, 4 + 64)) - return HA_ADMIN_INVALID; + { + errmsg = "failed in fn_format() for .MYD file: errno=%d"; + error = HA_ADMIN_INVALID; + goto err; + } if (my_copy(fn_format(src_path, table->path,"", MI_NAME_DEXT, 4), dst_path, MYF(MY_WME | MY_HOLD_ORIGINAL_MODES )) ) - return HA_ADMIN_FAILED; - + { + errmsg = "Failed copying .MYD file: errno = %d"; + error= HA_ADMIN_FAILED; + goto err; + } return HA_ADMIN_OK; + err: + { + MI_CHECK param; + myisamchk_init(¶m); + param.thd = thd; + param.op_name = (char*)"backup"; + param.table_name = table->table_name; + param.testflag = 0; + mi_check_print_error(¶m,errmsg, errno ); + return error; + } } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index bdafaf5bddd..68d2ab062c6 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -828,6 +828,7 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table) if(lock_retcode && wait_for_locked_table_names(thd, table)) { + unlock_table_name(thd, table); pthread_mutex_unlock(&LOCK_open); return -1; } @@ -838,6 +839,7 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table) reg_ext, 4), MYF(MY_WME))) { + unlock_table_name(thd, table); return send_check_errmsg(thd, table, "restore", "Failed copying .frm file"); } @@ -848,8 +850,9 @@ static int prepare_for_restore(THD* thd, TABLE_LIST* table) if(generate_table(thd, table, 0)) { - thd->net.no_send_ok = save_no_send_ok; - return send_check_errmsg(thd, table, "restore", + unlock_table_name(thd, table); + thd->net.no_send_ok = save_no_send_ok; + return send_check_errmsg(thd, table, "restore", "Failed generating table from .frm file"); } @@ -906,7 +909,8 @@ static int mysql_admin_table(THD* thd, TABLE_LIST* tables, // now we should be able to open the partially restored table // to finish the restore in the handler later on - table->table = reopen_name_locked_table(thd, table); + if(!(table->table = reopen_name_locked_table(thd, table))) + unlock_table_name(thd, table); } if (!table->table) |