summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Mäkelä <marko.makela@mariadb.com>2020-05-20 15:57:15 +0300
committerMarko Mäkelä <marko.makela@mariadb.com>2020-05-20 16:35:48 +0300
commit22a6fa572b8681edb61d250fd2a41c93ea7d448e (patch)
treea124e89a76b7c0c43cb621e6810fcb25077478d6
parented29782a03f1bbe39f9d9acc3ca0a42647461389 (diff)
downloadmariadb-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.cc43
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);
+ }
}
/*****************************************************************//**