Browse Source
MDEV-16376 ASAN: heap-use-after-free in gcol.innodb_virtual_debug
MDEV-16376 ASAN: heap-use-after-free in gcol.innodb_virtual_debug
After a failed ADD INDEX, dict_index_remove_from_cache_low() could iterate the index fields and dereference a freed virtual column object when trying to remove the index from the v_indexes of the virtual column. This regression was caused by a merge of MDEV-16119 InnoDB lock->index refers to a freed object. ha_innobase_inplace_ctx::clear_added_indexes(): Detach the indexes of uncommitted indexes from virtual columns, so that the iteration in dict_index_remove_from_cache_low() can be avoided. ha_innobase::prepare_inplace_alter_table(): Ignore uncommitted corrupted indexes when rejecting ALTER TABLE. (This minor bug was revealed by the extension of the test case.) dict_index_t::detach_columns(): Detach an index from virtual columns. Invoked by both dict_index_remove_from_cache_low() and ha_innobase_inplace_ctx::clear_added_indexes(). dict_col_t::detach(const dict_index_t& index): Detach an index from a column. dict_col_t::is_virtual(): Replaces dict_col_is_virtual(). dict_index_t::has_virtual(): Replaces dict_index_has_virtual().pull/767/head
8 changed files with 85 additions and 77 deletions
-
14mysql-test/suite/gcol/r/innodb_virtual_debug.result
-
15mysql-test/suite/gcol/t/innodb_virtual_debug.test
-
32storage/innobase/dict/dict0dict.cc
-
14storage/innobase/handler/handler0alter.cc
-
19storage/innobase/include/dict0dict.h
-
24storage/innobase/include/dict0dict.ic
-
42storage/innobase/include/dict0mem.h
-
2storage/innobase/row/row0upd.cc
Write
Preview
Loading…
Cancel
Save
Reference in new issue