mirror of
https://github.com/MariaDB/server.git
synced 2025-01-18 04:53:01 +01:00
c70a9fa1e3
The problem is that the server could crash when attempting to access a non-conformant proc system table. One such case was a crash when invoking stored procedure related statements on a 5.1 server with a proc system table in the 5.0 format. The solution is to validate the proc system table format before attempts to access it are made. If the table is not in the format that the server expects, a message is written to the error log and the statement that caused the table to be accessed fails. mysql-test/r/sp-destruct.result: Add test case result for Bug#41726 mysql-test/t/sp-destruct.test: Add test case for Bug#41726 sql/event_db_repository.cc: Update code to use new structures. sql/sp.cc: Describe the proc table format and use it to validate when opening a instance of the table. Add a check to insure that a error message is written to the error log only once. sql/sql_acl.cc: Remove unused variable and use new structure. sql/sql_acl.h: Export field definition. sql/table.cc: Accept the field count and definition in a single structure. sql/table.h: Combine the field count and definition in a single structure. Transform function into a class in order to support different ways of reporting a error. Add a pointer cache to TABLE_SHARE.
118 lines
5 KiB
Text
118 lines
5 KiB
Text
call mtr.add_suppression("Column count of mysql.proc is wrong. Expected 20, found 19. The table is probably corrupted");
|
|
use test;
|
|
drop procedure if exists bug14233;
|
|
drop function if exists bug14233;
|
|
drop table if exists t1;
|
|
drop view if exists v1;
|
|
create procedure bug14233()
|
|
set @x = 42;
|
|
create function bug14233_f() returns int
|
|
return 42;
|
|
create table t1 (id int);
|
|
create trigger t1_ai after insert on t1 for each row call bug14233();
|
|
alter table mysql.proc drop type;
|
|
call bug14233();
|
|
ERROR HY000: Column count of mysql.proc is wrong. Expected 20, found 19. The table is probably corrupted
|
|
create view v1 as select bug14233_f();
|
|
ERROR HY000: Column count of mysql.proc is wrong. Expected 20, found 19. The table is probably corrupted
|
|
insert into t1 values (0);
|
|
ERROR HY000: Column count of mysql.proc is wrong. Expected 20, found 19. The table is probably corrupted
|
|
show procedure status;
|
|
ERROR HY000: Column count of mysql.proc is wrong. Expected 20, found 19. The table is probably corrupted
|
|
flush table mysql.proc;
|
|
call bug14233();
|
|
ERROR HY000: Incorrect information in file: './mysql/proc.frm'
|
|
create view v1 as select bug14233_f();
|
|
ERROR HY000: Incorrect information in file: './mysql/proc.frm'
|
|
insert into t1 values (0);
|
|
ERROR HY000: Incorrect information in file: './mysql/proc.frm'
|
|
flush table mysql.proc;
|
|
call bug14233();
|
|
ERROR 42S02: Table 'mysql.proc' doesn't exist
|
|
create view v1 as select bug14233_f();
|
|
ERROR 42S02: Table 'mysql.proc' doesn't exist
|
|
insert into t1 values (0);
|
|
ERROR 42S02: Table 'mysql.proc' doesn't exist
|
|
flush table mysql.proc;
|
|
flush privileges;
|
|
delete from mysql.proc where name like 'bug14233%';
|
|
insert into mysql.proc
|
|
(
|
|
db, name, type, specific_name, language, sql_data_access, is_deterministic,
|
|
security_type, param_list, returns, body, definer, created, modified,
|
|
sql_mode, comment, character_set_client, collation_connection, db_collation,
|
|
body_utf8
|
|
)
|
|
values
|
|
(
|
|
'test', 'bug14233_1', 'FUNCTION', 'bug14233_1', 'SQL', 'READS_SQL_DATA', 'NO',
|
|
'DEFINER', '', 'int(10)',
|
|
'select count(*) from mysql.user',
|
|
'root@localhost', NOW() , '0000-00-00 00:00:00', '', '',
|
|
'', '', '',
|
|
'select count(*) from mysql.user'
|
|
),
|
|
(
|
|
'test', 'bug14233_2', 'FUNCTION', 'bug14233_2', 'SQL', 'READS_SQL_DATA', 'NO',
|
|
'DEFINER', '', 'int(10)',
|
|
'begin declare x int; select count(*) into x from mysql.user; end',
|
|
'root@localhost', NOW() , '0000-00-00 00:00:00', '', '',
|
|
'', '', '',
|
|
'begin declare x int; select count(*) into x from mysql.user; end'
|
|
),
|
|
(
|
|
'test', 'bug14233_3', 'PROCEDURE', 'bug14233_3', 'SQL', 'READS_SQL_DATA','NO',
|
|
'DEFINER', '', '',
|
|
'alksj wpsj sa ^#!@ ',
|
|
'root@localhost', NOW() , '0000-00-00 00:00:00', '', '',
|
|
'', '', '',
|
|
'alksj wpsj sa ^#!@ '
|
|
);
|
|
select bug14233_1();
|
|
ERROR HY000: Failed to load routine test.bug14233_1. The table mysql.proc is missing, corrupt, or contains bad data (internal code -6)
|
|
create view v1 as select bug14233_1();
|
|
ERROR HY000: Failed to load routine test.bug14233_1. The table mysql.proc is missing, corrupt, or contains bad data (internal code -6)
|
|
select bug14233_2();
|
|
ERROR HY000: Failed to load routine test.bug14233_2. The table mysql.proc is missing, corrupt, or contains bad data (internal code -6)
|
|
create view v1 as select bug14233_2();
|
|
ERROR HY000: Failed to load routine test.bug14233_2. The table mysql.proc is missing, corrupt, or contains bad data (internal code -6)
|
|
call bug14233_3();
|
|
ERROR HY000: Failed to load routine test.bug14233_3. The table mysql.proc is missing, corrupt, or contains bad data (internal code -6)
|
|
drop trigger t1_ai;
|
|
create trigger t1_ai after insert on t1 for each row call bug14233_3();
|
|
insert into t1 values (0);
|
|
ERROR HY000: Failed to load routine test.bug14233_3. The table mysql.proc is missing, corrupt, or contains bad data (internal code -6)
|
|
drop trigger t1_ai;
|
|
drop table t1;
|
|
drop function bug14233_1;
|
|
drop function bug14233_2;
|
|
drop procedure bug14233_3;
|
|
show procedure status where db=DATABASE();
|
|
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
|
show function status where db=DATABASE();
|
|
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
|
DROP TABLE IF EXISTS proc_backup;
|
|
DROP PROCEDURE IF EXISTS p1;
|
|
# Backup the proc table
|
|
RENAME TABLE mysql.proc TO proc_backup;
|
|
CREATE TABLE mysql.proc LIKE proc_backup;
|
|
FLUSH TABLE mysql.proc;
|
|
# Test with a valid table.
|
|
CREATE PROCEDURE p1()
|
|
SET @foo = 10;
|
|
CALL p1();
|
|
SHOW PROCEDURE STATUS;
|
|
Db Name Type Definer Modified Created Security_type Comment character_set_client collation_connection Database Collation
|
|
test p1 PROCEDURE root@localhost 0000-00-00 00:00:00 0000-00-00 00:00:00 DEFINER latin1 latin1_swedish_ci latin1_swedish_ci
|
|
# Modify a field of the table.
|
|
ALTER TABLE mysql.proc MODIFY comment CHAR (32);
|
|
CREATE PROCEDURE p2()
|
|
SET @foo = 10;
|
|
ERROR HY000: Cannot load from mysql.proc. The table is probably corrupted
|
|
# Procedure loaded from the cache
|
|
CALL p1();
|
|
SHOW PROCEDURE STATUS;
|
|
ERROR HY000: Cannot load from mysql.proc. The table is probably corrupted
|
|
DROP TABLE mysql.proc;
|
|
RENAME TABLE proc_backup TO mysql.proc;
|
|
FLUSH TABLE mysql.proc;
|