From: Alexander Nozdrin Date: April 25 2011 3:22pm Subject: bzr commit into mysql-5.1 branch (alexander.nozdrin:3670) Bug#12394306 List-Archive: http://lists.mysql.com/commits/136018 X-Bug: 12394306 Message-Id: <201104251522.p3PFMeRR020527@acsmt357.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============2732871913167920734==" --===============2732871913167920734== 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-04-25 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 if the created/modified columns have the MYSQL_TYPE_TIMESTAMP type before using them. modified: mysql-test/r/events_1.result mysql-test/t/events_1.test sql/event_data_objects.cc 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-04-25 15:22:23 +0000 @@ -309,7 +309,7 @@ ERROR HY000: Unknown event 'intact_check DROP EVENT no_such_event; ERROR HY000: Unknown event 'no_such_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' ALTER EVENT intact_check_1 RENAME TO intact_check_2; @@ -425,4 +425,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: Cannot load from mysql.event. The table is probably corrupted + +SELECT event_name, created, last_altered FROM information_schema.events; +ERROR HY000: Cannot load from mysql.event. The table is probably corrupted + +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/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-04-25 15:22:23 +0000 @@ -310,7 +310,7 @@ SELECT event_name FROM INFORMATION_SCHEM SHOW CREATE EVENT intact_check; --error ER_EVENT_DOES_NOT_EXIST 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 ALTER EVENT intact_check_1 ON SCHEDULE EVERY 8 HOUR DO SELECT 8; @@ -407,9 +407,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_CANNOT_LOAD_FROM_TABLE +SHOW EVENTS; + +--echo +--error ER_CANNOT_LOAD_FROM_TABLE +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 'sql/event_data_objects.cc' --- a/sql/event_data_objects.cc 2010-06-11 12:52:06 +0000 +++ b/sql/event_data_objects.cc 2011-04-25 15:22:23 +0000 @@ -617,6 +617,12 @@ Event_timed::load_from_row(THD *thd, TAB definer_host.str= strmake_root(&mem_root, ptr + 1, len); definer_host.length= len; + if (table->field[ET_FIELD_CREATED]->type() != MYSQL_TYPE_TIMESTAMP || + table->field[ET_FIELD_MODIFIED]->type() != MYSQL_TYPE_TIMESTAMP) + { + DBUG_RETURN(TRUE); + } + created= table->field[ET_FIELD_CREATED]->val_int(); modified= table->field[ET_FIELD_MODIFIED]->val_int(); === 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-04-25 15:22:23 +0000 @@ -317,7 +317,13 @@ mysql_event_fill_row(THD *thd, */ } - ((Field_timestamp *)fields[ET_FIELD_MODIFIED])->set_time(); + if (fields[ET_FIELD_MODIFIED]->type() == MYSQL_TYPE_TIMESTAMP) + ((Field_timestamp *) fields[ET_FIELD_MODIFIED])->set_time(); + else + { + my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0)); + DBUG_RETURN(TRUE); + } if (et->comment.str) { @@ -671,7 +677,14 @@ Event_db_repository::create_event(THD *t goto end; } - ((Field_timestamp *)table->field[ET_FIELD_CREATED])->set_time(); + if (table->field[ET_FIELD_CREATED]->type() == MYSQL_TYPE_TIMESTAMP) + ((Field_timestamp *) table->field[ET_FIELD_CREATED])->set_time(); + else + { + my_error(ER_EVENT_OPEN_TABLE_FAILED, MYF(0)); + DBUG_RETURN(TRUE); + } + /* mysql_event_fill_row() calls my_error() in case of error so no need to --===============2732871913167920734== 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\ # 9nf4y70nbj8nvfzy # target_branch: file:///home/alik/MySQL/bzr/00/bug_events/mysql-5.1/ # testament_sha1: 3e9a992211bc44a7efa4ade53b0326765580b24e # timestamp: 2011-04-25 19:22:32 +0400 # base_revision_id: mattias.jonsson@stripped\ # m0vrgdyqj9tvfs6d # # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWYvuqdwABOvfgFAwePf//3/v /6q////+YAtdX226d1mqAAFoygjM0NAA0AAUJRJMjI0DKNij1Dyn6o02qfqYQjIwgyPTUGNBMJVT 1GgGQAMgAAAAAAAAABzCaA0Bo0YRoMRpiZMTQYRoGQDJgJEgRRT9lT0yZKabKbQBpA9E9NqPUyaA yDUMT0HMJoDQGjRhGgxGmJkxNBhGgZAMmAkkCGgBBpMJlMTJo0GoT0JiaPU0HqAGJM2mLm0c/N82 dPNL1vpo6dv7naveWaM7CrjYglEb3YMMrj+MtVw2yxcUX+67+nH6HBdoPaMU/7CzVE9KOpJNgIp2 ApzzFKQYMaLGi6byblcMmFrXOG23eizDySnEB5Qckj2V8BqXTslCD/I8nEX6tWQGYwBFIMjETemh U+5rMgfwJwUUUVQVQs73+EjWNtm4YmDykMo1otBPdiXQEpPEJyNy6L2delncRcQVtIwzm07NxxN/ 8QII6xwfIcf0BgKSk8ypXB0NZNDk8CxcHWAHa0QQgNgDQ2gPQTH4kVx8neROUSRWPYmWJKOXiagV 5gMXcKUf5q/3Y4trUVGH8y1Un6XjzBdh6FgeQf9J5s0A8gxtuNisiESLkWuD4sa7R0B5m+jzkAa9 u5BLcwK4SI8qFbaq77MscBmOPKMgoDDscGTgSo0gx4Wxttt7i0x5jbF7jgMxyn7KwfmsJhnIjyM2 +OjUcfDnLxgIkRDZlM5ODSlAPi1KACsMTIOyR+KSOgFe89buo9K1HvXa4adPdCkicfpy1wkW5oDX rSCs+8pVNqF58hcgrjWFjg2xEXsXEyGKV2+S4USxsEMWZGm+SAm0Tg3BafB+sNZpQ9JTBht5NQKp j3khoGBSEXDQFAfPmTRsBRlymWVJU6rgXV2FmtaEDaqLOfYXj6LeTMVAGw6jmN8MNlQBl21YhqdV OupbL3n2qj5W8cTf1c632Gu8qRcTAY1yTi2H34vWILIsNkNuHjed125moXAvDYVFxgGvAjndERDV XQwVlvUkKSIKt2u0uomPIuRk51AJwCrVSzRGjVlIE4lM5jOsIyJFPbw2UpXDVOqPz3lpL0dRWYh8 T1FdVLNVWGoEz2WrAUFi4aI5w5G3Y4hqJ7CjErlItOFiccnF6wIFpIvPqrM6dY9+6tPxRMV78Xsk n4jgyCWBIszkRsmqp0r45HAfVRKN0X8xr34HB1LUtoiRJ0mLisr/Q4kjQFTLIorhWPuDSJypIMRS UATFdTzvHEDHKVb09g1lWRWRXBwQPukV0HGqYxcUUGhA24FjqKc5YtEukME8XVJiTEqH5RDM35j8 xrQmGq2xkaUkjyWN5oQy2moxJnkcViTtne2uTGUi8h5AtkuW+a5nQ0t3ZHTtHnEyJj6eArjVUVjj iURq2OGJm+JEB/d0JXFBuKhqDEtnr1utL6salXlcd3Kki8FhhXA3tSUzYrGxMS4qU5ECneNOk6oG HBpGOszGKcTiC1LnJFywyeE4Oe2DVQi0XJ02RCLxOrqiRZK1X9Th0bP6UddmJOKpVLWcWqFOt40c +sbswWyoJmDgMAtG53hokEOIefAK/siJ2HYhgFyE0fM/w5EHh2izaabfSkuVUzrzDN0CopKYKaaN axRICgTEvorxrzk3BiDAZ7CBfQZ9l7kHWkgNoC31bGxZQVT/0g50UFkRQgBgj5FyKV+goCWtDAWo rQ4xPyIouTCgDDhymYrcIeBcDI3oNyLDYjNGZIuLDaLjMgDAgFJEIoYl4upHXCCqJqhJDSmI1qkg cSgeIYYSrovAuC82omKIDBYhkTNwKq0KEMjYjjrRmBeEUMYmxBrLlJbBZhgilLNMkmDIQUmQwXoi jEsEUkhDiwpAZF6LkGYnokRNqcE1BDCxHotJFhYtqwAoAwVSQnBSSAxNaNZQhkc15M0xMViE0bCK ikMaaOpWMUURtI8K7bD1EQG+kM9DS1rDoqeCiFlHxvxGqWouE2FeI4sDVktgajXh92lM2fVlEF/r MhymzODCKpdlbYuI4zUhhn9l1Vj1FoSNLdfeIlGgp3ZEQ8R/UXkt7apuELVgZVui9GmdHbQpGqXe CBwNEDxSYz6n7wkPczSaiJwbS4j5kJ3HhtJryNhXA6swU5ib5OMjxL/mHUWnxALCTHls92hZ1GGl 3vPmGGyyZzq7ft0yJCCRe6W0egPbUVVGQQY0kCvs28B9xhewJjgaW8DCRpxg3T5mRyIdY47jVYKY m2ESCCi4UOrHK5lI4ksnViUKIHQkeKPQGX0CVVxfcS7VnVpTtPe3b1ydYDMeLkmjVEGCKBY6cC8y N2EtMndm3vloUDEp1jaBeHEgy1uxCaWhs2KNpqPQII1bvn73hwJjnOd4XK2MEvizF4xNflJZFd4R pVsx4s8N1YfRhhQGmxKlKWGoErCTAyEMgt1PBhLr05DLf29aPSRLJEbOT0MmLVBV4COSQeNgzwHD x7hmIqSWSSpQc5lYu5M718wOZeP6bh3BxuBROB3g4613ItRoMGnWDfh9IesHha3tOhar4EWPJ447 E9gT12Lw8TtOa8mZKQdZmk6rWdj/YVm839q8Bw4Q3bnaOP2jAxqi9j9S02jxBh9BzMy48TiCrW9t GTbLfWgbRB9Yx66NiXcgqSqJAuC20AUSEuKXBKi+JVvbsq7OFDyQmZigW5J68ZuDHto9oJybvOB1 LkON/IeZ7xyuPTyOSXwryMuIGIkXA9LPk8HbBhyDmGsWCAckO/GYlBt0PaeqZcb6yCpLy11Jvpmc yBUyAbROcdEclcmtK8kwmHsHpN9pOhhvAqPs/5Wq0WFB6yn1mhxPmU2JBmXGGRmn2t7rxyUUJgxd kvCLyoK2XSPkKpQJRf3HPygmEOwQ6q4tKosWVHYhbyRRQsEkH8hzlWwkweYLQ8uPeIOaMis6Fpoz wYyX3cU8ZIOReB4Jg9REj0TOrKk7C7B6GY80A9J94mRSjygJl1Lb3sQq++KFqWQl0L+xgYUEfWKY Vkyzgt1B1zU4C9ITuMKRjhcsAFzuLqtzCczB0e8+JpEA6Vkh6kgKGS2VaLKDlIfJImta1ezYj2Kk lMXy9wk5GhoWHYYLd06z3lkeSWHwMErkMbRrX2KhEE8T9mLjuWVLhmpIPV64vKBks+qXLMyzMNRL Ddrl8RyivGKIhLNLWnh6MRZYL7A+DMzMzTKztEjHcmV4yIpYSejvhGQMxeyYc5s7ExhBbTqGOvsI AU0ljwB3mAzx5AL19R+sl+RHsN858Q75Jzb35lx3pxeIZu9mYPSU7als2i0K7KA+imaH6kpHRNxp 5j4lFjiMAHsKilQG81vKewOe4+09R0GL7jTqMPP8F69S2FB4D6sg+A/XBHBazb7DzPYYdgj1GEyq uKAM0wEGVieCxrgl7uaxke0utaXgXHE+4cZnA9GHPAS8r0Gc3iSDbLGlaZIcmpuQb4LfKy13o7So JE5bRK9GotzuzN3QFBfmwf/F3JFOFCQi+6p3AA== --===============2732871913167920734==--