Commit 633207b5 authored by unknown's avatar unknown
Browse files

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
Loading
Loading
Loading
Loading
+21 −10
Original line number Diff line number Diff line
@@ -2113,10 +2113,10 @@ static int dump_all_tables_in_db(char *database)
  different case (e.g.  T1 vs t1)
  
  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, 
                                  int buf_size)
{
@@ -2137,9 +2137,19 @@ static void get_actual_table_name(const char *old_table_name,
  }

  tableRes= mysql_store_result( sock );
  if (tableRes != NULL)
  {
	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)
     char new_table_name[NAME_LEN];

     /* 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);
	    if (!dFlag && numrows > 0)
	      dumpTable(numrows, new_table_name);
     }
    my_free(order_by, MYF(MY_ALLOW_ZERO_PTR));
    order_by= 0;
  }