Commit 143c8b5a authored by Jimmy Yang's avatar Jimmy Yang

Merge fix for bug #55039 from mysql-5.1-security to mysql-trunk-security.

bug #55039 Failing assertion: space_id > 0 in fil0fil.c line 2618 .

rb://396 approved by Sunny Bains
parents 24484791 74f23d7e
...@@ -240,17 +240,29 @@ dict_build_table_def_step( ...@@ -240,17 +240,29 @@ dict_build_table_def_step(
ibool is_path; ibool is_path;
mtr_t mtr; mtr_t mtr;
ulint space = 0; ulint space = 0;
ibool file_per_table;
ut_ad(mutex_own(&(dict_sys->mutex))); ut_ad(mutex_own(&(dict_sys->mutex)));
table = node->table; table = node->table;
dict_hdr_get_new_id(&table->id, NULL, /* Cache the global variable "srv_file_per_table" to
srv_file_per_table ? &space : NULL); a local variable before using it. Please note
"srv_file_per_table" is not under dict_sys mutex
protection, and could be changed while executing
this function. So better to cache the current value
to a local variable, and all future reference to
"srv_file_per_table" should use this local variable. */
file_per_table = srv_file_per_table;
dict_hdr_get_new_id(&table->id, NULL, NULL);
thr_get_trx(thr)->table_id = table->id; thr_get_trx(thr)->table_id = table->id;
if (srv_file_per_table) { if (file_per_table) {
/* Get a new space id if srv_file_per_table is set */
dict_hdr_get_new_id(NULL, NULL, &space);
if (UNIV_UNLIKELY(space == ULINT_UNDEFINED)) { if (UNIV_UNLIKELY(space == ULINT_UNDEFINED)) {
return(DB_ERROR); return(DB_ERROR);
} }
......
...@@ -1453,7 +1453,11 @@ try_again: ...@@ -1453,7 +1453,11 @@ try_again:
/* When srv_file_per_table is on, file creation failure may not /* When srv_file_per_table is on, file creation failure may not
be critical to the whole instance. Do not crash the server in be critical to the whole instance. Do not crash the server in
case of unknown errors. */ case of unknown errors.
Please note "srv_file_per_table" is a global variable with
no explicit synchronization protection. It could be
changed during this execution path. It might not have the
same value as the one when building the table definition */
if (srv_file_per_table) { if (srv_file_per_table) {
retry = os_file_handle_error_no_exit(name, retry = os_file_handle_error_no_exit(name,
create_mode == OS_FILE_CREATE ? create_mode == OS_FILE_CREATE ?
...@@ -1540,7 +1544,11 @@ try_again: ...@@ -1540,7 +1544,11 @@ try_again:
/* When srv_file_per_table is on, file creation failure may not /* When srv_file_per_table is on, file creation failure may not
be critical to the whole instance. Do not crash the server in be critical to the whole instance. Do not crash the server in
case of unknown errors. */ case of unknown errors.
Please note "srv_file_per_table" is a global variable with
no explicit synchronization protection. It could be
changed during this execution path. It might not have the
same value as the one when building the table definition */
if (srv_file_per_table) { if (srv_file_per_table) {
retry = os_file_handle_error_no_exit(name, retry = os_file_handle_error_no_exit(name,
create_mode == OS_FILE_CREATE ? create_mode == OS_FILE_CREATE ?
......
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