diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-05-20 15:57:15 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-05-20 16:35:48 +0300 |
commit | 22a6fa572b8681edb61d250fd2a41c93ea7d448e (patch) | |
tree | a124e89a76b7c0c43cb621e6810fcb25077478d6 | |
parent | ed29782a03f1bbe39f9d9acc3ca0a42647461389 (diff) | |
download | mariadb-git-22a6fa572b8681edb61d250fd2a41c93ea7d448e.tar.gz |
MDEV-19114 post-push fix: SIGSEGV on INSERT
ins_node_create_entry_list(): Create dummy empty tuples for
corrupted or incomplete indexes, to avoid dereferencing a NULL
dict_field_t::col pointer in row_build_index_entry_low().
This issue was found by a crash in the test gcol.innodb_virtual_basic
when merging the fix to 10.5.
-rw-r--r-- | storage/innobase/row/row0ins.cc | 43 |
1 files changed, 15 insertions, 28 deletions
diff --git a/storage/innobase/row/row0ins.cc b/storage/innobase/row/row0ins.cc index 123566132f4..2ca54e90c4e 100644 --- a/storage/innobase/row/row0ins.cc +++ b/storage/innobase/row/row0ins.cc @@ -95,35 +95,22 @@ ins_node_create( return(node); } -/***********************************************************//** -Creates an entry template for each index of a table. */ -static -void -ins_node_create_entry_list( -/*=======================*/ - ins_node_t* node) /*!< in: row insert node */ +/** Create an row template for each index of a table. */ +static void ins_node_create_entry_list(ins_node_t *node) { - dict_index_t* index; - dtuple_t* entry; - - ut_ad(node->entry_sys_heap); - - /* We will include all indexes (include those corrupted - secondary indexes) in the entry list. Filtration of - these corrupted index will be done in row_ins() */ - - node->entry_list.reserve(UT_LIST_GET_LEN(node->table->indexes)); - - for (index = dict_table_get_first_index(node->table); - index != 0; - index = dict_table_get_next_index(index)) { - - entry = row_build_index_entry_low( - node->row, NULL, index, node->entry_sys_heap, - ROW_BUILD_FOR_INSERT); - - node->entry_list.push_back(entry); - } + node->entry_list.reserve(UT_LIST_GET_LEN(node->table->indexes)); + + for (dict_index_t *index= dict_table_get_first_index(node->table); index; + index= dict_table_get_next_index(index)) + { + /* Corrupted or incomplete secondary indexes will be filtered out in + row_ins(). */ + dtuple_t *entry= index->online_status >= ONLINE_INDEX_ABORTED + ? dtuple_create(node->entry_sys_heap, 0) + : row_build_index_entry_low(node->row, NULL, index, node->entry_sys_heap, + ROW_BUILD_FOR_INSERT); + node->entry_list.push_back(entry); + } } /*****************************************************************//** |