summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2001-01-18 17:36:20 -0700
committerunknown <sasha@mysql.sashanet.com>2001-01-18 17:36:20 -0700
commit1ad779d47c5e7b1e4e044053f9fa8bca71ac9e2b (patch)
tree6be6f043d9869e97211581cece15de29cc37352f
parentc862fa36467651ef3e3cb3acad61e42fc0b3e07c (diff)
downloadmariadb-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.c8
-rw-r--r--mysql-test/r/backup.result39
-rw-r--r--mysql-test/t/backup.test31
-rw-r--r--mysql-test/t/rpl000004.test2
-rw-r--r--sql/ha_myisam.cc39
-rw-r--r--sql/sql_table.cc10
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(&param);
+ param.thd = thd;
+ param.op_name = (char*)"backup";
+ param.table_name = table->table_name;
+ param.testflag = 0;
+ mi_check_print_error(&param,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)