From: Alexander Nozdrin Date: May 4 2011 12:09pm Subject: bzr commit into mysql-5.1 branch (alexander.nozdrin:3670) Bug#12394306 List-Archive: http://lists.mysql.com/commits/136646 X-Bug: 12394306 Message-Id: <201105041210.p44CA3YL027823@acsmt358.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============6980971917504374020==" --===============6980971917504374020== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/alik/MySQL/bzr/00/bug_events/mysql-5.1/ based on revid:mattias.jonsson@stripped 3670 Alexander Nozdrin 2011-05-04 Patch for Bug#12394306: the sever may crash if mysql.event is corrupted. The problem was that wrong structure of mysql.event was not detected and the server continued to use wrongly-structured data. The fix is to check the structure of mysql.event after opening before any use. That makes operations with events more strict -- some operations that might work before throw errors now. That seems to be Ok. Another side-effect of the patch is that if mysql.event is corrupted, unrelated DROP DATABASE statements issue an SQL warning about inability to open mysql.event table. modified: mysql-test/r/events_1.result mysql-test/r/events_restart.result mysql-test/t/events_1.test mysql-test/t/events_restart.test sql/event_db_repository.cc === modified file 'mysql-test/r/events_1.result' --- a/mysql-test/r/events_1.result 2008-02-20 13:40:46 +0000 +++ b/mysql-test/r/events_1.result 2011-05-04 12:09:47 +0000 @@ -1,3 +1,4 @@ +call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted"); drop database if exists events_test; drop database if exists db_x; drop database if exists mysqltest_db2; @@ -259,33 +260,36 @@ events_test intact_check root@localhost Try to alter mysql.event: the server should fail to load event information after mysql.event was tampered with. -First, let's add a column to the end and make sure everything -works as before +First, let's add a column to the end and check the error is emitted. ALTER TABLE mysql.event ADD dummy INT; SHOW EVENTS; -Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation -events_test intact_check root@localhost SYSTEM RECURRING NULL 10 # # NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci +ERROR HY000: Failed to open mysql.event SELECT event_name FROM INFORMATION_SCHEMA.events; -event_name -intact_check +ERROR HY000: Failed to open mysql.event SHOW CREATE EVENT intact_check; -Event sql_mode time_zone Create Event character_set_client collation_connection Database Collation -intact_check SYSTEM CREATE EVENT `intact_check` ON SCHEDULE EVERY 10 HOUR STARTS '#' ON COMPLETION NOT PRESERVE ENABLE DO SELECT "nothing" latin1 latin1_swedish_ci latin1_swedish_ci +ERROR HY000: Failed to open mysql.event DROP EVENT no_such_event; -ERROR HY000: Unknown event 'no_such_event' +ERROR HY000: Failed to open mysql.event CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5; +ERROR HY000: Failed to open mysql.event ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8; +ERROR HY000: Failed to open mysql.event ALTER EVENT intact_check_1 RENAME TO intact_check_2; +ERROR HY000: Failed to open mysql.event DROP EVENT intact_check_1; -ERROR HY000: Unknown event 'intact_check_1' +ERROR HY000: Failed to open mysql.event DROP EVENT intact_check_2; +ERROR HY000: Failed to open mysql.event DROP EVENT intact_check; +ERROR HY000: Failed to open mysql.event DROP DATABASE IF EXISTS mysqltest_no_such_database; Warnings: Note 1008 Can't drop database 'mysqltest_no_such_database'; database doesn't exist CREATE DATABASE mysqltest_db2; DROP DATABASE mysqltest_db2; +Warnings: +Error 1545 Failed to open mysql.event SELECT @@event_scheduler; @@event_scheduler OFF @@ -294,6 +298,7 @@ Variable_name Value event_scheduler OFF SET GLOBAL event_scheduler=OFF; ALTER TABLE mysql.event DROP dummy; +DROP EVENT intact_check; CREATE EVENT intact_check ON SCHEDULE EVERY 10 HOUR DO SELECT "nothing"; Now let's add a column to the first position: the server @@ -301,30 +306,32 @@ expects to see event schema name there ALTER TABLE mysql.event ADD dummy INT FIRST; SHOW EVENTS; -ERROR HY000: Cannot load from mysql.event. The table is probably corrupted +ERROR HY000: Failed to open mysql.event SELECT event_name FROM INFORMATION_SCHEMA.events; -ERROR HY000: Cannot load from mysql.event. The table is probably corrupted +ERROR HY000: Failed to open mysql.event SHOW CREATE EVENT intact_check; -ERROR HY000: Unknown event 'intact_check' +ERROR HY000: Failed to open mysql.event DROP EVENT no_such_event; -ERROR HY000: Unknown event 'no_such_event' +ERROR HY000: Failed to open mysql.event CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5; -ERROR HY000: Failed to store event name. Error code 2 from storage engine. +ERROR HY000: Failed to open mysql.event ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8; -ERROR HY000: Unknown event 'intact_check_1' +ERROR HY000: Failed to open mysql.event ALTER EVENT intact_check_1 RENAME TO intact_check_2; -ERROR HY000: Unknown event 'intact_check_1' +ERROR HY000: Failed to open mysql.event DROP EVENT intact_check_1; -ERROR HY000: Unknown event 'intact_check_1' +ERROR HY000: Failed to open mysql.event DROP EVENT intact_check_2; -ERROR HY000: Unknown event 'intact_check_2' +ERROR HY000: Failed to open mysql.event DROP EVENT intact_check; -ERROR HY000: Unknown event 'intact_check' +ERROR HY000: Failed to open mysql.event DROP DATABASE IF EXISTS mysqltest_no_such_database; Warnings: Note 1008 Can't drop database 'mysqltest_no_such_database'; database doesn't exist CREATE DATABASE mysqltest_db2; DROP DATABASE mysqltest_db2; +Warnings: +Error 1545 Failed to open mysql.event SELECT @@event_scheduler; @@event_scheduler OFF @@ -345,29 +352,32 @@ Drop some columns and try more checks. ALTER TABLE mysql.event DROP comment, DROP starts; SHOW EVENTS; -ERROR HY000: Cannot load from mysql.event. The table is probably corrupted +ERROR HY000: Failed to open mysql.event SELECT event_name FROM INFORMATION_SCHEMA.EVENTS; -ERROR HY000: Cannot load from mysql.event. The table is probably corrupted +ERROR HY000: Failed to open mysql.event SHOW CREATE EVENT intact_check; -ERROR HY000: Cannot load from mysql.event. The table is probably corrupted +ERROR HY000: Failed to open mysql.event DROP EVENT no_such_event; -ERROR HY000: Unknown event 'no_such_event' +ERROR HY000: Failed to open mysql.event CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5; -ERROR HY000: Column count of mysql.event is wrong. Expected 22, found 20. The table is probably corrupted +ERROR HY000: Failed to open mysql.event ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8; -ERROR HY000: Unknown event 'intact_check_1' +ERROR HY000: Failed to open mysql.event ALTER EVENT intact_check_1 RENAME TO intact_check_2; -ERROR HY000: Unknown event 'intact_check_1' +ERROR HY000: Failed to open mysql.event DROP EVENT intact_check_1; -ERROR HY000: Unknown event 'intact_check_1' +ERROR HY000: Failed to open mysql.event DROP EVENT intact_check_2; -ERROR HY000: Unknown event 'intact_check_2' +ERROR HY000: Failed to open mysql.event DROP EVENT intact_check; +ERROR HY000: Failed to open mysql.event DROP DATABASE IF EXISTS mysqltest_no_such_database; Warnings: Note 1008 Can't drop database 'mysqltest_no_such_database'; database doesn't exist CREATE DATABASE mysqltest_db2; DROP DATABASE mysqltest_db2; +Warnings: +Error 1545 Failed to open mysql.event SELECT @@event_scheduler; @@event_scheduler OFF @@ -425,4 +435,42 @@ CREATE TABLE mysql.event like event_like DROP TABLE event_like; SHOW EVENTS; Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation + +# +# Bug#12394306: the sever may crash if mysql.event is corrupted +# + +CREATE EVENT ev1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5; +ALTER EVENT ev1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8; + +CREATE TABLE event_original LIKE mysql.event; +INSERT INTO event_original SELECT * FROM mysql.event; + +ALTER TABLE mysql.event MODIFY modified CHAR(1); +Warnings: +Warning 1265 Data truncated for column 'modified' at row 1 + +SHOW EVENTS; +ERROR HY000: Failed to open mysql.event + +SELECT event_name, created, last_altered FROM information_schema.events; +ERROR HY000: Failed to open mysql.event + +CREATE EVENT ev2 ON SCHEDULE EVERY 5 HOUR DO SELECT 5; +ERROR HY000: Failed to open mysql.event + +ALTER EVENT ev1 ON SCHEDULE EVERY 9 HOUR DO SELECT 9; +ERROR HY000: Failed to open mysql.event + +DROP TABLE mysql.event; +RENAME TABLE event_original TO mysql.event; + +DROP EVENT ev1; + +SHOW EVENTS; +Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation + +# +# End of tests +# drop database events_test; === modified file 'mysql-test/r/events_restart.result' --- a/mysql-test/r/events_restart.result 2008-04-09 07:43:20 +0000 +++ b/mysql-test/r/events_restart.result 2011-05-04 12:09:47 +0000 @@ -1,3 +1,4 @@ +call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted"); set global event_scheduler=off; drop database if exists events_test; create database events_test; @@ -52,6 +53,8 @@ Warnings: Note 1008 Can't drop database 'mysqltest_database_not_exists'; database doesn't exist create database mysqltest_db1; drop database mysqltest_db1; +Warnings: +Error 1545 Failed to open mysql.event Restore the original mysql.event table drop table mysql.event; rename table event_like to mysql.event; === modified file 'mysql-test/t/events_1.test' --- a/mysql-test/t/events_1.test 2008-02-22 20:28:59 +0000 +++ b/mysql-test/t/events_1.test 2011-05-04 12:09:47 +0000 @@ -4,6 +4,8 @@ # Can't test with embedded server that doesn't support grants -- source include/not_embedded.inc +call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted"); + --disable_warnings drop database if exists events_test; drop database if exists db_x; @@ -270,23 +272,28 @@ SHOW EVENTS; --echo Try to alter mysql.event: the server should fail to load --echo event information after mysql.event was tampered with. --echo ---echo First, let's add a column to the end and make sure everything ---echo works as before +--echo First, let's add a column to the end and check the error is emitted. --echo ALTER TABLE mysql.event ADD dummy INT; ---replace_column 8 # 9 # +--error ER_EVENT_OPEN_TABLE_FAILED SHOW EVENTS; +--error ER_EVENT_OPEN_TABLE_FAILED SELECT event_name FROM INFORMATION_SCHEMA.events; ---replace_regex /STARTS '[^']+'/STARTS '#'/ +--error ER_EVENT_OPEN_TABLE_FAILED SHOW CREATE EVENT intact_check; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT no_such_event; +--error ER_EVENT_OPEN_TABLE_FAILED CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5; +--error ER_EVENT_OPEN_TABLE_FAILED ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8; +--error ER_EVENT_OPEN_TABLE_FAILED ALTER EVENT intact_check_1 RENAME TO intact_check_2; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT intact_check_1; +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT intact_check_2; +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT intact_check; DROP DATABASE IF EXISTS mysqltest_no_such_database; CREATE DATABASE mysqltest_db2; @@ -296,6 +303,7 @@ SHOW VARIABLES LIKE 'event_scheduler'; SET GLOBAL event_scheduler=OFF; # Clean up ALTER TABLE mysql.event DROP dummy; +DROP EVENT intact_check; CREATE EVENT intact_check ON SCHEDULE EVERY 10 HOUR DO SELECT "nothing"; --echo --echo Now let's add a column to the first position: the server @@ -303,24 +311,26 @@ CREATE EVENT intact_check ON SCHEDULE EV --echo ALTER TABLE mysql.event ADD dummy INT FIRST; --error ER_CANNOT_LOAD_FROM_TABLE +--error ER_EVENT_OPEN_TABLE_FAILED SHOW EVENTS; --error ER_CANNOT_LOAD_FROM_TABLE +--error ER_EVENT_OPEN_TABLE_FAILED SELECT event_name FROM INFORMATION_SCHEMA.events; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED SHOW CREATE EVENT intact_check; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT no_such_event; ---error ER_EVENT_STORE_FAILED +--error ER_EVENT_OPEN_TABLE_FAILED CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED ALTER EVENT intact_check_1 RENAME TO intact_check_2; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT intact_check_1; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT intact_check_2; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT intact_check; # Should work OK DROP DATABASE IF EXISTS mysqltest_no_such_database; @@ -341,25 +351,25 @@ INSERT INTO event_like SELECT * FROM mys --echo --echo ALTER TABLE mysql.event DROP comment, DROP starts; ---error ER_CANNOT_LOAD_FROM_TABLE +--error ER_EVENT_OPEN_TABLE_FAILED SHOW EVENTS; ---error ER_CANNOT_LOAD_FROM_TABLE +--error ER_EVENT_OPEN_TABLE_FAILED SELECT event_name FROM INFORMATION_SCHEMA.EVENTS; ---error ER_CANNOT_LOAD_FROM_TABLE +--error ER_EVENT_OPEN_TABLE_FAILED SHOW CREATE EVENT intact_check; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT no_such_event; ---error ER_COL_COUNT_DOESNT_MATCH_CORRUPTED +--error ER_EVENT_OPEN_TABLE_FAILED CREATE EVENT intact_check_1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED ALTER EVENT intact_check_1 RENAME TO intact_check_2; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT intact_check_1; ---error ER_EVENT_DOES_NOT_EXIST +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT intact_check_2; -# Should succeed +--error ER_EVENT_OPEN_TABLE_FAILED DROP EVENT intact_check; DROP DATABASE IF EXISTS mysqltest_no_such_database; CREATE DATABASE mysqltest_db2; @@ -407,9 +417,54 @@ CREATE TABLE mysql.event like event_like DROP TABLE event_like; --replace_column 8 # 9 # SHOW EVENTS; -# -# End of tests -# + +--echo +--echo # +--echo # Bug#12394306: the sever may crash if mysql.event is corrupted +--echo # + +--echo +CREATE EVENT ev1 ON SCHEDULE EVERY 5 HOUR DO SELECT 5; +ALTER EVENT ev1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8; + +--echo +CREATE TABLE event_original LIKE mysql.event; +INSERT INTO event_original SELECT * FROM mysql.event; + +--echo +ALTER TABLE mysql.event MODIFY modified CHAR(1); + +--echo +--error ER_EVENT_OPEN_TABLE_FAILED +SHOW EVENTS; + +--echo +--error ER_EVENT_OPEN_TABLE_FAILED +SELECT event_name, created, last_altered FROM information_schema.events; + +--echo +--error ER_EVENT_OPEN_TABLE_FAILED +CREATE EVENT ev2 ON SCHEDULE EVERY 5 HOUR DO SELECT 5; + +--echo +--error ER_EVENT_OPEN_TABLE_FAILED +ALTER EVENT ev1 ON SCHEDULE EVERY 9 HOUR DO SELECT 9; + +--echo +DROP TABLE mysql.event; +RENAME TABLE event_original TO mysql.event; + +--echo +DROP EVENT ev1; + +--echo +SHOW EVENTS; + + +--echo +--echo # +--echo # End of tests +--echo # let $wait_condition= select count(*) = 0 from information_schema.processlist === modified file 'mysql-test/t/events_restart.test' --- a/mysql-test/t/events_restart.test 2008-04-09 07:43:20 +0000 +++ b/mysql-test/t/events_restart.test 2011-05-04 12:09:47 +0000 @@ -1,6 +1,8 @@ # Can't test with embedded server that doesn't support grants -- source include/not_embedded.inc +call mtr.add_suppression("Column count of mysql.event is wrong. Expected .*, found .*\. The table is probably corrupted"); + # # Test that when the server is restarted, it checks mysql.event table, # and disables the scheduler if it's not up to date. === modified file 'sql/event_db_repository.cc' --- a/sql/event_db_repository.cc 2011-03-21 16:02:47 +0000 +++ b/sql/event_db_repository.cc 2011-05-04 12:09:47 +0000 @@ -582,6 +582,16 @@ Event_db_repository::open_event_table(TH *table= tables.table; tables.table->use_all_columns(); + + if (table_intact.check(*table, &event_table_def)) + { + sql_print_information("--> table_intact.check() failed!"); + close_thread_tables(thd); + my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0)); + DBUG_RETURN(TRUE); + } + sql_print_information("--> table_intact.check() succeeded."); + DBUG_RETURN(FALSE); } --===============6980971917504374020== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/alexander.nozdrin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alexander.nozdrin@stripped\ # jofz19g0o8uhxiql # target_branch: file:///home/alik/MySQL/bzr/00/bug_events/mysql-5.1/ # testament_sha1: 4a8d03cdfabf32a128976e56fa0417205a9a36ad # timestamp: 2011-05-04 16:09:54 +0400 # base_revision_id: mattias.jonsson@stripped\ # m0vrgdyqj9tvfs6d # # Begin bundle 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 --===============6980971917504374020==--