Commit 59717bbc authored by Oleksandr Byelkin's avatar Oleksandr Byelkin

MDEV-5924: MariaDB could crash after changing the query_cache size

The real problem was that attempt to roll back cahnes after end of memory in QC was made incorrectly and lead to using uninitialized memory.
(bug has nothing to do with resize operation, it is just lack of resources erro processed incorrectly)
parent 61862d71
This diff is collapsed.
This diff is collapsed.
...@@ -3367,7 +3367,7 @@ Query_cache::register_tables_from_list(THD *thd, TABLE_LIST *tables_used, ...@@ -3367,7 +3367,7 @@ Query_cache::register_tables_from_list(THD *thd, TABLE_LIST *tables_used,
if (!insert_table(thd, key_length, key, (*block_table), if (!insert_table(thd, key_length, key, (*block_table),
tables_used->view_db.length, 0, tables_used->view_db.length, 0,
HA_CACHE_TBL_NONTRANSACT, 0, 0, TRUE)) HA_CACHE_TBL_NONTRANSACT, 0, 0, TRUE))
DBUG_RETURN(0); goto err_cleanup;
/* /*
We do not need to register view tables here because they are already We do not need to register view tables here because they are already
present in the global list. present in the global list.
...@@ -3391,7 +3391,7 @@ Query_cache::register_tables_from_list(THD *thd, TABLE_LIST *tables_used, ...@@ -3391,7 +3391,7 @@ Query_cache::register_tables_from_list(THD *thd, TABLE_LIST *tables_used,
tables_used->callback_func, tables_used->callback_func,
tables_used->engine_data, tables_used->engine_data,
TRUE)) TRUE))
DBUG_RETURN(0); goto err_cleanup;
if (tables_used->table->file-> if (tables_used->table->file->
register_query_cache_dependant_tables(thd, this, block_table, &n)) register_query_cache_dependant_tables(thd, this, block_table, &n))
...@@ -3399,6 +3399,11 @@ Query_cache::register_tables_from_list(THD *thd, TABLE_LIST *tables_used, ...@@ -3399,6 +3399,11 @@ Query_cache::register_tables_from_list(THD *thd, TABLE_LIST *tables_used,
} }
} }
DBUG_RETURN(n - counter); DBUG_RETURN(n - counter);
err_cleanup:
// Mark failed
(*block_table)->next= (*block_table)->prev= NULL;
(*block_table)->parent= NULL;
DBUG_RETURN(0);
} }
/* /*
...@@ -3432,7 +3437,12 @@ my_bool Query_cache::register_all_tables(THD *thd, ...@@ -3432,7 +3437,12 @@ my_bool Query_cache::register_all_tables(THD *thd,
for (Query_cache_block_table *tmp = block->table(0) ; for (Query_cache_block_table *tmp = block->table(0) ;
tmp != block_table; tmp != block_table;
tmp++) tmp++)
unlink_table(tmp); {
if (tmp->prev) // not marked as failed and unuseable
unlink_table(tmp);
else
break;
}
if (block_table->parent) if (block_table->parent)
unlink_table(block_table); unlink_table(block_table);
} }
......
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