Bug #42634 | % character in query can cause mysqld signal 11 segfault | ||
---|---|---|---|
Submitted: | 6 Feb 2009 0:46 | Modified: | 18 Feb 2009 20:09 |
Reporter: | Noah E | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server | Severity: | S2 (Serious) |
Version: | 5.1.31, 5.1 bzr | OS: | Linux (Redhat ES 4 X86_64) |
Assigned to: | Davi Arnaut | CPU Architecture: | Any |
Tags: | binlog, crash, regression, statement not safe |
[6 Feb 2009 0:46]
Noah E
[6 Feb 2009 0:57]
Noah E
Oh wow, I just noticed that if you dont include the "limit 1" in the query it doesn't crash either! Its the combination of the % characters and the limit 1 which crashes mysqld on my system. I just tried it on other tables in my database, same crash. For example: update users set email = '%5b%B1b%b%1b%15b!%b!bh!Bb' where id = '7' limit 1 CRASH.
[6 Feb 2009 6:56]
Sveta Smirnova
Thank you for the report. Verified as described. Having binary log enabled is necessary to get the crash. Storage engine does not matter. Backtrace from 5.1-bzr: #0 0x002ce402 in __kernel_vsyscall () #0 0x002ce402 in __kernel_vsyscall () #1 0x0046264f in pthread_kill () from /lib/libpthread.so.0 #2 0x085a33b5 in my_write_core (sig=11) at stacktrace.c:310 #3 0x0824c061 in handle_segfault (sig=11) at mysqld.cc:2505 #4 <signal handler called> #5 0x0035840a in memmove () from /lib/libc.so.6 #6 0x085cf28c in my_vsnprintf (to=0xb7459ad4 "##r\b#####E#c#Z\b\020/X\t#^F", n=1024, fmt=0xb7459ff2 "b0%91%e5%b9%b4%ee%99%91' where ip =\n'1474024258' LIMIT 1", ap=0xb7459f48 "##g\bZJP\t##[\t\204#E#\200#E#:x=\b Oo\b##o\b\f\n") at my_vsnprintf.c:112 #7 0x0831ff8b in vprint_msg_to_log (level=WARNING_LEVEL, format=0xb7459f80 "Statement is not safe to log in statement format. Statement: UPDATE ChatUsers set nowplaying = 'Animetal - Ufo%e5%b0%91%e5%b9%b4%ee%99%91' where ip =\n'1474024258' LIMIT 1", args=0xb7459f44 "") at log.cc:4780 #8 0x0831ffe3 in Log_to_file_event_handler::log_error (this=0x94f7c50, level=WARNING_LEVEL, format=0xb7459f80 "Statement is not safe to log in statement format. Statement: UPDATE ChatUsers set nowplaying = 'Animetal - Ufo%e5%b0%91%e5%b9%b4%ee%99%91' where ip =\n'1474024258' LIMIT 1", args=0xb7459f44 "") at log.cc:727 #9 0x0831522b in LOGGER::error_log_print (this=0x8874400, level=WARNING_LEVEL, format=0xb7459f80 "Statement is not safe to log in statement format. Statement: UPDATE ChatUsers set nowplaying = 'Animetal - Ufo%e5%b0%91%e5%b9%b4%ee%99%91' where ip =\n'1474024258' LIMIT 1", args=0xb7459f44 "") at log.cc:834 #10 0x083179bb in error_log_print (level=WARNING_LEVEL, format=0xb7459f80 "Statement is not safe to log in statement format. Statement: UPDATE ChatUsers set nowplaying = 'Animetal - Ufo%e5%b0%91%e5%b9%b4%ee%99%91' where ip =\n'1474024258' LIMIT 1", args=0xb7459f44 "") at log.cc:4087 #11 0x0832004c in sql_print_warning ( format=0xb7459f80 "Statement is not safe to log in statement format. Statement: UPDATE ChatUsers set nowplaying = 'Animetal - Ufo%e5%b0%91%e5%b9%b4%ee%99%91' where ip =\n'1474024258' LIMIT 1") at log.cc:4811 #12 0x0823b409 in THD::binlog_query (this=0x95428e8, qtype=THD::ROW_QUERY_TYPE, query_arg=0x95bd1d8 "UPDATE ChatUsers set nowplaying = 'Animetal - Ufo%e5%b0%91%e5%b9%b4%ee%99%91' where ip =\n'1474024258' LIMIT 1", query_len=109, is_trans=false, suppress_use=false, killed_status_arg=THD::NOT_KILLED) at sql_class.cc:3672 #13 0x08309db7 in mysql_update (thd=0x95428e8, table_list=0x95bd338, fields=@0x9543d10, values=@0x9543f24, conds=0x95bd7e8, order_num=0, order=0x0, limit=0, handle_duplicates=DUP_ERROR, ignore=false) at sql_update.cc:798 #14 0x08263964 in mysql_execute_command (thd=0x95428e8) at sql_parse.cc:2981 #15 0x0826a752 in mysql_parse (thd=0x95428e8, inBuf=0x95bd1d8 "UPDATE ChatUsers set nowplaying = 'Animetal - Ufo%e5%b0%91%e5%b9%b4%ee%99%91' where ip =\n'1474024258' LIMIT 1", length=109, found_semicolon=0xb745b2fc) at sql_parse.cc:5809 #16 0x0826b38e in dispatch_command (command=COM_QUERY, thd=0x95428e8, packet=0x9587629 "UPDATE ChatUsers set nowplaying = 'Animetal - Ufo%e5%b0%91%e5%b9%b4%ee%99%91' where ip =\n'1474024258' LIMIT 1", packet_length=109) at sql_parse.cc:1216 #17 0x0826c5ac in do_command (thd=0x95428e8) at sql_parse.cc:857 #18 0x0825922d in handle_one_connection (arg=0x95428e8) at sql_connect.cc:1115 #19 0x0045fbd4 in start_thread () from /lib/libpthread.so.0 #20 0x003b74fe in clone () from /lib/libc.so.6
[6 Feb 2009 7:02]
Sveta Smirnova
Bug exists only in version 5.1 and was introduced in version 5.1.29
[6 Feb 2009 7:04]
Sveta Smirnova
Reduced test case: --source include/have_log_bin.inc CREATE TABLE `ChatUsers` ( `ip` int(10) unsigned NOT NULL, `nowplaying` varchar(100) NOT NULL ); INSERT INTO ChatUsers(ip) VALUES('1474024258'); UPDATE ChatUsers set nowplaying = 'Animetal - Ufo%e5%b0%91%e5%b9%b4%ee%99%91' where ip = '1474024258' LIMIT 1;
[6 Feb 2009 8:40]
Sveta Smirnova
See also bug #42640
[8 Feb 2009 2:16]
Davi Arnaut
Bug#42674 has been marked as a duplicate of this bug.
[8 Feb 2009 8:55]
Mark Plomer
At Bug#42674 I posted yesterday the simple patch for this crash: At "mysql-5.1.31/sql/sql_class.cc" in function "THD::binlog_query": Replace "sql_print_warning(warn_buf);" with "sql_print_warning("%s", warn_buf);" or remove the my_snprintf call and use sql_print_warning directly with "%s Statement: %s" ...
[9 Feb 2009 11:59]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/65597 2793 Davi Arnaut 2009-02-09 Bug#42634: % character in query can cause mysqld signal 11 segfault The problem is that a unfiltered user query was being passed as the format string parameter of sql_print_warning which later performs printf-like formatting, leading to crashes if the user query contains formatting instructions (ie: %s). Also, it was using THD::query as the source of the user query, but this variable is not meaningful in some situations -- in a delayed insert, it points to the table name. The solution is to pass the user query as a parameter for the format string and use the function parameter query_arg as the source of the user query.
[9 Feb 2009 18:18]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/65641 2794 Davi Arnaut 2009-02-09 Bug#42634: % character in query can cause mysqld signal 11 segfault The problem is that a unfiltered user query was being passed as the format string parameter of sql_print_warning which later performs printf-like formatting, leading to crashes if the user query contains formatting instructions (ie: %s). Also, it was using THD::query as the source of the user query, but this variable is not meaningful in some situations -- in a delayed insert, it points to the table name. The solution is to pass the user query as a parameter for the format string and use the function parameter query_arg as the source of the user query.
[9 Feb 2009 18:30]
Davi Arnaut
Queued to 5.1-bugteam
[9 Feb 2009 22:34]
Bugs System
Pushed into 5.1.32 (revid:davi.arnaut@sun.com-20090209214102-gj3sb3ujpnvpiy4c) (version source revid:davi.arnaut@sun.com-20090209214102-gj3sb3ujpnvpiy4c) (merge vers: 5.1.32) (pib:6)
[14 Feb 2009 13:01]
Bugs System
Pushed into 6.0.10-alpha (revid:matthias.leich@sun.com-20090212211028-y72faag15q3z3szy) (version source revid:matthias.leich@sun.com-20090212211028-y72faag15q3z3szy) (merge vers: 6.0.10-alpha) (pib:6)
[17 Feb 2009 14:57]
Bugs System
Pushed into 5.1.32-ndb-6.3.23 (revid:tomas.ulin@sun.com-20090217131017-6u8qz1edkjfiobef) (version source revid:tomas.ulin@sun.com-20090216083408-rmvyaxjt6mk8sg1y) (merge vers: 5.1.32-ndb-6.3.23) (pib:6)
[17 Feb 2009 16:45]
Bugs System
Pushed into 5.1.32-ndb-6.4.3 (revid:tomas.ulin@sun.com-20090217134419-5ha6xg4dpedrbmau) (version source revid:tomas.ulin@sun.com-20090216083646-m8st11oj1hhfuuh5) (merge vers: 5.1.32-ndb-6.4.3) (pib:6)
[17 Feb 2009 18:21]
Bugs System
Pushed into 5.1.32-ndb-6.2.17 (revid:tomas.ulin@sun.com-20090217134216-5699eq74ws4oxa0j) (version source revid:tomas.ulin@sun.com-20090211111208-wf0acl7c1vl5653e) (merge vers: 5.1.32-ndb-6.2.17) (pib:6)
[18 Feb 2009 20:09]
Paul DuBois
Noted in 5.1.32, 6.0.10 changelogs. A '%' character in SQL statements could cause the server to crash.
[23 May 2010 14:04]
MySQL Verification Team
bug #53869 is a duplicate of this