mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 11:57:38 +02:00
fil0fil.c:
Add assertions to check that we do not go out of bounds of io thread status array os0file.c: Fix memory corruption (assertion failure on line 244 of sync0sync.c) reported by Miguel in a Windows build of MySQL-4.1.2. The bug is present in all InnoDB versions in Windows, but it depends on how the linker places a static array in srv0srv.c, whether the bug shows itself. 4 bytes were overwritten with a pointer to a statically allocated string: 'get windows aio return value'. innobase/os/os0file.c: Fix memory corruption (assertion failure on line 244 of sync0sync.c) reported by Miguel in a Windows build of MySQL-4.1.2. The bug is present in all InnoDB versions in Windows, but it depends on how the linker places a static array in srv0srv.c, whether the bug shows itself. 4 bytes were overwritten with a pointer to a statically allocated string: 'get windows aio return value'. innobase/fil/fil0fil.c: Add assertions to check that we do not go out of bounds of io thread status array
This commit is contained in:
parent
bdb370c872
commit
f4b6dab211
2 changed files with 19 additions and 4 deletions
|
|
@ -1586,6 +1586,7 @@ os_aio_init(
|
|||
os_io_init_simple();
|
||||
|
||||
for (i = 0; i < n_segments; i++) {
|
||||
ut_a(i < SRV_MAX_N_IO_THREADS);
|
||||
srv_io_thread_op_info[i] = (char*)"not started yet";
|
||||
}
|
||||
|
||||
|
|
@ -1606,12 +1607,14 @@ os_aio_init(
|
|||
os_aio_read_array = os_aio_array_create(n_read_segs * n_per_seg,
|
||||
n_read_segs);
|
||||
for (i = 2; i < 2 + n_read_segs; i++) {
|
||||
ut_a(i < SRV_MAX_N_IO_THREADS);
|
||||
srv_io_thread_function[i] = (char*)"read thread";
|
||||
}
|
||||
|
||||
os_aio_write_array = os_aio_array_create(n_write_segs * n_per_seg,
|
||||
n_write_segs);
|
||||
for (i = 2 + n_read_segs; i < n_segments; i++) {
|
||||
ut_a(i < SRV_MAX_N_IO_THREADS);
|
||||
srv_io_thread_function[i] = (char*)"write thread";
|
||||
}
|
||||
|
||||
|
|
@ -2324,11 +2327,10 @@ os_aio_windows_handle(
|
|||
n = array->n_slots / array->n_segments;
|
||||
|
||||
if (array == os_aio_sync_array) {
|
||||
srv_io_thread_op_info[orig_seg] =
|
||||
"wait Windows aio for 1 page";
|
||||
os_event_wait(os_aio_array_get_nth_slot(array, pos)->event);
|
||||
i = pos;
|
||||
} else {
|
||||
ut_a(orig_seg < SRV_MAX_N_IO_THREADS);
|
||||
srv_io_thread_op_info[orig_seg] =
|
||||
"wait Windows aio";
|
||||
i = os_event_wait_multiple(n,
|
||||
|
|
@ -2341,7 +2343,12 @@ os_aio_windows_handle(
|
|||
|
||||
ut_a(slot->reserved);
|
||||
|
||||
srv_io_thread_op_info[orig_seg] = "get windows aio return value";
|
||||
if (orig_seg != ULINT_UNDEFINED) {
|
||||
ut_a(orig_seg < SRV_MAX_N_IO_THREADS);
|
||||
srv_io_thread_op_info[orig_seg] =
|
||||
"get windows aio return value";
|
||||
}
|
||||
|
||||
ret = GetOverlappedResult(slot->file, &(slot->control), &len, TRUE);
|
||||
|
||||
*message1 = slot->message1;
|
||||
|
|
@ -2663,7 +2670,8 @@ consecutive_loop:
|
|||
offs += consecutive_ios[i]->len;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ut_a(global_segment < SRV_MAX_N_IO_THREADS);
|
||||
srv_io_thread_op_info[global_segment] = (char*) "doing file i/o";
|
||||
|
||||
if (os_aio_print_debug) {
|
||||
|
|
@ -2714,6 +2722,7 @@ consecutive_loop:
|
|||
}
|
||||
|
||||
ut_a(ret);
|
||||
ut_a(global_segment < SRV_MAX_N_IO_THREADS);
|
||||
srv_io_thread_op_info[global_segment] = (char*) "file i/o done";
|
||||
|
||||
/* printf("aio: %lu consecutive %lu:th segment, first offs %lu blocks\n",
|
||||
|
|
@ -2772,6 +2781,7 @@ wait_for_io:
|
|||
os_mutex_exit(array->mutex);
|
||||
|
||||
recommended_sleep:
|
||||
ut_a(global_segment < SRV_MAX_N_IO_THREADS);
|
||||
srv_io_thread_op_info[global_segment] =
|
||||
(char*)"waiting for i/o request";
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue