Commit 633207b5 authored by unknown's avatar unknown

Bug #9175 seg fault on 'mysqldump --single-transaction --tab mysql nonexistent'

My code in get_actual_tablename was not checking to make sure SHOW TABLES LIKE % was returning rows.  Now I check that the resultset is not null and has at least 1 row before I process the table.

mysqldump.c:
  Add code to get_actual_tablename() to guard against SHOW TABLES LIKE not returning any rows


client/mysqldump.c:
  Add code to get_actual_tablename() to guard against SHOW TABLES LIKE not returning any rows
parent b9c6c482
...@@ -2113,10 +2113,10 @@ static int dump_all_tables_in_db(char *database) ...@@ -2113,10 +2113,10 @@ static int dump_all_tables_in_db(char *database)
different case (e.g. T1 vs t1) different case (e.g. T1 vs t1)
RETURN RETURN
void int - 0 if a tablename was retrieved. 1 if not
*/ */
static void get_actual_table_name(const char *old_table_name, static int get_actual_table_name(const char *old_table_name,
char *new_table_name, char *new_table_name,
int buf_size) int buf_size)
{ {
...@@ -2137,9 +2137,19 @@ static void get_actual_table_name(const char *old_table_name, ...@@ -2137,9 +2137,19 @@ static void get_actual_table_name(const char *old_table_name,
} }
tableRes= mysql_store_result( sock ); tableRes= mysql_store_result( sock );
row= mysql_fetch_row( tableRes ); if (tableRes != NULL)
strmake(new_table_name, row[0], buf_size-1); {
mysql_free_result(tableRes); my_ulonglong numRows = mysql_num_rows(tableRes);
if (numRows > 0)
{
row= mysql_fetch_row( tableRes );
strmake(new_table_name, row[0], buf_size-1);
return 0;
}
mysql_free_result(tableRes);
return 1;
}
return 1;
} }
...@@ -2179,11 +2189,12 @@ static int dump_selected_tables(char *db, char **table_names, int tables) ...@@ -2179,11 +2189,12 @@ static int dump_selected_tables(char *db, char **table_names, int tables)
char new_table_name[NAME_LEN]; char new_table_name[NAME_LEN];
/* the table name passed on commandline may be wrong case */ /* the table name passed on commandline may be wrong case */
get_actual_table_name( *table_names, new_table_name, sizeof(new_table_name) ); if (!get_actual_table_name( *table_names, new_table_name, sizeof(new_table_name) ))
{
numrows = getTableStructure(new_table_name, db); numrows = getTableStructure(new_table_name, db);
if (!dFlag && numrows > 0) if (!dFlag && numrows > 0)
dumpTable(numrows, new_table_name); dumpTable(numrows, new_table_name);
}
my_free(order_by, MYF(MY_ALLOW_ZERO_PTR)); my_free(order_by, MYF(MY_ALLOW_ZERO_PTR));
order_by= 0; order_by= 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment