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: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]
Shane Bester
bug #53869 is a duplicate of this
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.051 sec. using MySQL 8.4.7-u6-cloud
Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the
respective copyright holders.
It is not reviewed in advance
by Oracle and does not necessarily represent the opinion of
Oracle or any other party.
Description: I am able to crash mysqld 100% of the time simply by running these specific and simple update queries: Notes: I have binlog on in statement format and I am replicating to one slave. Notes: ChatUsers used to be a MEMORY table but i switched it to InnoDB to see if the problem would fix, but it still caused a crash. How to repeat: Create Table: CREATE TABLE `ChatUsers` ( `aid` int(11) NOT NULL DEFAULT '0', `room` int(11) NOT NULL DEFAULT '50000', `host` enum('deviator','dummie') NOT NULL DEFAULT 'deviator', `active` tinyint(1) NOT NULL DEFAULT '0', `idle` tinyint(1) NOT NULL DEFAULT '0', `nick` varchar(25) NOT NULL DEFAULT '''Someone''', `avatar` varchar(200) NOT NULL DEFAULT '', `color` varchar(40) NOT NULL DEFAULT '', `icon` varchar(30) NOT NULL DEFAULT '', `admin` tinyint(4) NOT NULL DEFAULT '0', `ip` int(10) unsigned NOT NULL, `port` int(11) NOT NULL, `nowplaying` varchar(100) NOT NULL, `warn` tinyint(3) unsigned NOT NULL DEFAULT '0', `tstamp` int(12) unsigned NOT NULL DEFAULT '0', `INSERTED` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`aid`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 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; (mysqld crashes before query returns) Suggested fix: I discovered that this query however worked fine: UPDATE ChatUsers set nowplaying = 'Animetal - Ufo' where ip = '1474024258' LIMIT 1; Somehow the jumble of % characters caused the fault. However, this warning occured, which I cant figure out why: [Warning] Statement is not safe to log in statement format.