From: Alexander Nozdrin Date: May 4 2011 12:59pm Subject: bzr commit into mysql-5.1 branch (alexander.nozdrin:3681) Bug#12394306 List-Archive: http://lists.mysql.com/commits/136657 X-Bug: 12394306 Message-Id: <201105041259.p44Cxb9r002755@acsmt356.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4058837069196306851==" --===============4058837069196306851== 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:kent.boortz@stripped 3681 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:59:24 +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:59:24 +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:59:24 +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:59:24 +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:59:24 +0000 @@ -582,6 +582,14 @@ Event_db_repository::open_event_table(TH *table= tables.table; tables.table->use_all_columns(); + + if (table_intact.check(*table, &event_table_def)) + { + close_thread_tables(thd); + my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0)); + DBUG_RETURN(TRUE); + } + DBUG_RETURN(FALSE); } --===============4058837069196306851== 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\ # pbwr2k9x04qdgxh8 # target_branch: file:///home/alik/MySQL/bzr/00/bug_events/mysql-5.1/ # testament_sha1: 83186cda23e5aa734d2a7c8adea121f6790fdc8d # timestamp: 2011-05-04 16:59:31 +0400 # base_revision_id: kent.boortz@stripped\ # hly6eg3ekjzv138k # # Begin bundle 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 /adyuIn8XckU4UJBSwnO+A== --===============4058837069196306851==--