mirror of
https://github.com/MariaDB/server.git
synced 2026-04-29 03:35:34 +02:00
A fix and a test case for Bug#34166 Server crash in SHOW OPEN TABLES and
pre-locking. The crash was caused by an implicit assumption in check_table_access() that table_list parameter is always a part of lex->query_tables. When iterating over the passed list of tables, check_table_access() used to stop only when lex->query_tables_last_not_own was reached. In case of pre-locking, lex->query_tables_last_own is not NULL and points to some element of lex->query_tables. When the parameter of check_table_access() was not part of lex->query_tables, loop invariant could never be violated and a crash would happen when the current table pointer would point beyond the end of the provided list. The fix is to change the signature of check_table_access() to also accept a numeric limit of loop iterations, similarly to check_grant(), and supply this limit in all places when we want to check access of tables that are outside lex->query_tables, or just want to check access to one table. mysql-test/r/information_schema.result: Update test results (Bug#34166). mysql-test/t/information_schema.test: Add a test case for Bug#34166. sql/mysql_priv.h: Change signature of check_table_access() to accept a numeric limit of tables to check. sql/sp_head.cc: Update to the new signature of check_table_access(). sql/sql_acl.cc: Improve code clarity: if there is a numeric limit, we should not need to look at first_not_own_table. sql/sql_base.cc: Update to the new signature of check_table_access(). sql/sql_cache.cc: Update to the new signature of check_table_access(). sql/sql_parse.cc: Update to the new signature of check_table_access(). Change check_table_access() to accept an optional numeric limit of tables to check. A crash would happen when check_table_access() was passed a list of tables that is not part of lex->query_tables and lex->query_tables_last_own was not NULL. sql/sql_plugin.cc: Update to the new signature of check_table_access(). sql/sql_prepare.cc: Update to the new signature of check_table_access(). sql/sql_show.cc: Update to the new signature of check_table_access(). Ensure that check_table_access() only checks access to the first table in the table list when called from list_open_tables(). list_open_tables() supplies a table list that is created on stack, whereas check_table_access() used to assume that the supplied list is a part of thd->lex. sql/sql_trigger.cc: Update to the new signature of check_table_access(). sql/sql_view.cc: Update to the new signature of check_table_access().
This commit is contained in:
parent
97355f4e0a
commit
39509d64c3
13 changed files with 94 additions and 53 deletions
|
|
@ -1248,4 +1248,26 @@ show events from information_schema;
|
|||
show events where Db= 'information_schema';
|
||||
use test;
|
||||
|
||||
--echo #
|
||||
--echo # Bug#34166: Server crash in SHOW OPEN TABLES and prelocking
|
||||
--echo #
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
drop function if exists f1;
|
||||
--enable_warnings
|
||||
create table t1 (a int);
|
||||
delimiter |;
|
||||
create function f1() returns int
|
||||
begin
|
||||
insert into t1 (a) values (1);
|
||||
return 0;
|
||||
end|
|
||||
delimiter ;|
|
||||
--disable_result_log
|
||||
show open tables where f1()=0;
|
||||
show open tables where f1()=0;
|
||||
--enable_result_log
|
||||
drop table t1;
|
||||
drop function f1;
|
||||
|
||||
--echo End of 5.1 tests.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue