| Bug #44332 | my_xml_scan reads behind the end of buffer | ||
|---|---|---|---|
| Submitted: | 17 Apr 2009 0:26 | Modified: | 28 Jan 2011 12:14 |
| Reporter: | Vladislav Vaintroub | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: XML functions | Severity: | S2 (Serious) |
| Version: | 6.0, 5.1, 5.6.99 bzr | OS: | Any |
| Assigned to: | Alexander Barkov | CPU Architecture: | Any |
[17 Apr 2009 0:26]
Vladislav Vaintroub
[17 Apr 2009 0:27]
Vladislav Vaintroub
The bug is similar to Bug#2399
[31 Aug 2010 18:45]
Sveta Smirnova
Bug exists in 5.1 too. Now it uses memcmp and does not check length as well. Looks like bug #2399 was fixed for memcmp(p->cur,"<!--",4) only and not for next string (!memcmp(p->cur, "<![CDATA[",9))
[31 Aug 2010 18:53]
Sveta Smirnova
Suggested fix:
=== modified file 'strings/xml.c'
--- strings/xml.c 2010-07-02 18:30:47 +0000
+++ strings/xml.c 2010-08-31 18:51:40 +0000
@@ -132,7 +132,7 @@
a->end=p->cur;
lex=MY_XML_COMMENT;
}
- else if (!memcmp(p->cur, "<![CDATA[",9))
+ else if ((p->end - p->cur > 8) && !memcmp(p->cur, "<![CDATA[",9))
{
p->cur+= 9;
for (; p->cur < p->end - 2 ; p->cur++)
[27 Dec 2010 20:41]
MySQL Verification Team
Here's a testcase that shows valgrind warnings on 5.6.2:
select updatexml(convert('<' using utf8),'1','1');
Conditional jump or move depends on uninitialised value(s)
at: bcmp (mc_replace_strmem.c:541)
by: my_xml_scan (xml.c:135)
by: my_xml_parse (xml.c:278)
by: Item_xml_str_func::parse_xml (item_xmlfunc.cc:2778)
by: Item_func_xml_update::val_str (item_xmlfunc.cc:2816)
by: Item::send (item.cc:5931)
by: Protocol::send_result_set_row (protocol.cc:848)
by: select_send::send_data (sql_class.cc:1866)
by: JOIN::exec (sql_select.cc:2794)
by: mysql_select (sql_select.cc:3554)
by: handle_select (sql_select.cc:323)
by: execute_sqlcom_select (sql_parse.cc:4513)
by: mysql_execute_command (sql_parse.cc:2096)
by: mysql_parse (sql_parse.cc:5550)
by: dispatch_command (sql_parse.cc:1078)
by: do_command (sql_parse.cc:815)
by: do_handle_one_connection (sql_connect.cc:748)
by: handle_one_connection (sql_connect.cc:684)
by: start_thread (pthread_create.c:301)
[17 Jan 2011 14:14]
Alexander Barkov
Another problem in the same code, read behind the end of the string
when processing incomplete XML comment:
mysql> select updatexml(convert('<!--' using utf8),'1','1');
==19617== Conditional jump or move depends on uninitialised value(s)
==19617== at 0x4A07AF3: bcmp (mc_replace_strmem.c:646)
==19617== by 0xB9521C: my_xml_scan (xml.c:137)
==19617== by 0xB95A90: my_xml_parse (xml.c:285)
==19617== by 0x678983: Item_xml_str_func::parse_xml(String*, String*) (item_xmlfunc.cc:2770)
[17 Jan 2011 14:52]
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/128988 3558 Alexander Barkov 2011-01-17 Bug#44332 my_xml_scan reads behind the end of buffer Problem: the scanner function tested for strings "<![CDATA[" and "<--" without checking input string boundaries, which led to valgrind's "Conditional jump or move depends on uninitialised value(s)" error. Fix: Adding boundary checking. @ mysql-test/r/xml.result @ mysql-test/t/xml.test Adding test @ strings/xml.c Adding a helper function my_xml_parser_prefix_cmp(), with input string boundary check.
[18 Jan 2011 6:43]
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/129017 3559 Alexander Barkov 2011-01-18 Bug#44332 my_xml_scan reads behind the end of buffer Problem: the scanner function tested for strings "<![CDATA[" and "-->" without checking input string boundaries, which led to valgrind's "Conditional jump or move depends on uninitialised value(s)" error. Fix: Adding boundary checking. @ mysql-test/r/xml.result @ mysql-test/t/xml.test Adding test @ strings/xml.c Adding a helper function my_xml_parser_prefix_cmp(), with input string boundary check.
[18 Jan 2011 6:44]
Bugs System
Pushed into mysql-5.1 5.1.56 (revid:alexander.barkov@oracle.com-20110118063841-4hryslwcfpyrp606) (version source revid:alexander.barkov@oracle.com-20110118063841-4hryslwcfpyrp606) (merge vers: 5.1.56) (pib:24)
[18 Jan 2011 6:54]
Bugs System
Pushed into mysql-5.5 5.5.10 (revid:alexander.barkov@oracle.com-20110118065003-65h5ws819pr5du7d) (version source revid:alexander.barkov@oracle.com-20110118065003-65h5ws819pr5du7d) (merge vers: 5.5.10) (pib:24)
[18 Jan 2011 6:57]
Bugs System
Pushed into mysql-trunk 5.6.2 (revid:alexander.barkov@oracle.com-20110118065345-xj7b0r11c2yj0v3m) (version source revid:alexander.barkov@oracle.com-20110118065345-xj7b0r11c2yj0v3m) (merge vers: 5.6.2) (pib:24)
[26 Jan 2011 15:25]
Jon Stephens
Documented bugfix in the 5.1.56, 5.5.10, and 5.6.2 changelogs, as follows:
When using ExtractValue() or UpdateXML(), if the XML to be read
contained an incomplete XML comment, MySQL read beyond the end
of the string when processing, leading to a crash of the server.
Closed.
[28 Jan 2011 12:14]
Jon Stephens
Already documented as noted above; set back to Closed.
