Bug #21311 Possible stack overrun if SP has non-latin1 name
| Submitted: | 27 Jul 2006 11:41 | Modified: | 4 Oct 2006 2:32 |
|---|---|---|---|
| Reporter: | Andrey Hristov | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Stored Routines | Severity: | S2 (Serious) |
| Version: | 5.0 | OS: | Any (All) |
| Assigned to: | Andrey Hristov | CPU Architecture: | Any |
[30 Aug 2006 16:12]
Tomash Brechko
Approved by e-mail with several comments.
[30 Aug 2006 19:35]
Petr Chardin
approved by email (after adding a test)
[27 Sep 2006 19:30]
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/12648 ChangeSet@1.2257, 2006-09-27 21:23:17+02:00, andrey@example.com +3 -0 Fix for bug#21311: Possible stack overrun if SP has non-latin1 name There was possible stack overrun in an edge case which handles invalid body of a SP in mysql.proc . That should be case when mysql.proc has been changed manually. Though, due to bug 21513, it can be exploited without having access to mysql.proc only being able to create a stored routine.
[3 Oct 2006 19:37]
Dmitry Lenev
Fixed in 5.0.27 and 5.1.12
[4 Oct 2006 2:32]
Paul DuBois
Noted in 5.0.27, 5.1.12 changelogs. It was possible for a stored routine with a non-latin1 name to cause a stack overrun.
[25 Oct 2006 16:46]
Paul DuBois
The 5.0.x fix is in 5.0.30.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.061 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: In sp.cc, function sp_cache_routines_and_add_tables_aux() the following code is used: if (!thd->net.report_error) { char n[NAME_LEN*2+2]; /* m_qname.str is not always \0 terminated */ memcpy(n, name.m_qname.str, name.m_qname.length); n[name.m_qname.length]= '\0'; my_error(ER_SP_PROC_TABLE_CORRUPT, MYF(0), n, ret); } NAME_LEN is defined in include/mysql_com.h as #define NAME_LEN 64 /* Field/table name length */ This is the length in characters, not in bytes. If the db + name of the routine is long enough and are not latin1 -> for example cyrillic. This could lead to possible stack overrun. How to repeat: Check the sources. Suggested fix: Use n[NAMELEN * 3 * 2 + 2] Considering that our utf8 is limited to 3 byte sequences.