Bug #16144 mysql_stmt_attr_get type error
| Submitted: | 3 Jan 2006 1:38 | Modified: | 2 Feb 2006 4:27 |
|---|---|---|---|
| Reporter: | Eric Huss (Candidate Quality Contributor) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S3 (Non-critical) |
| Version: | 5.1 | OS: | Linux (Linux, FreeBSD i386) |
| Assigned to: | Konstantin Osipov | CPU Architecture: | Any |
[11 Jan 2006 15:44]
Valeriy Kravchuk
Thank you for a bug report. Verified just as described on 5.0.19-BK (ChangeSet@1.2020.3.1, 2006-01-10 13:44:08+02:00) on Linux: [openxs@Fedora 5.0]$ gcc -o 16144 `$CFG --cflags` 16144.c `$CFG --libs` [openxs@Fedora 5.0]$ ./16144 flag=0xbfe9bd2f other=0xbfe9bd34 flag=0xbfe9bd2f other=0xbf000000 0 [openxs@Fedora 5.0]$ uname -a Linux Fedora 2.4.22-1.2115.nptl #1 Wed Oct 29 15:42:51 EST 2003 i686 i686 i386 GNU/Linux
[17 Jan 2006 20:19]
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/1218
[17 Jan 2006 21:26]
Konstantin Osipov
Fixed in 4.1.17, merged into 5.0.19
[2 Feb 2006 4:27]
Mike Hillyer
Documented in 4.1.17 and 5.0.19 changelogs:
<listitem>
<para>
The <function>mysql_stmt_attr_get</function> function returned
an unsigned int instead of a boolean for
<literal>STMT_ATTR_UPDATE_MAX_LENGTH</literal>. (Bug #16144)
</para>
</listitem>
[4 Mar 2006 19:35]
Konstantin Osipov
The patch for this bug breaks binary compatibility and will be reverted in 4.1 and 5.0 release series. It will be kept in 5.1 and up.
[4 Mar 2006 20:05]
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/3469
[4 Mar 2006 21:39]
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/3472
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.056 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: The documentation indicates that the STMT_ATTR_UPDATE_MAX_LENGTH attribute is a my_bool type. However, mysql_stmt_attr_get assumes it is an unsigned long. If you attempt to call mysql_stmt_attr_get passing in a pointer to a my_bool object defined on the stack, this can cause potential stack corruption (possibly leading to a segmentation fault). How to repeat: The following demonstrates stack corruption: #include <stdio.h> #include <mysql.h> main() { unsigned long value; void * other_p; my_bool flag; void * flag_p; MYSQL * mysql; MYSQL_STMT * stmt; value = 7; flag_p = &flag; other_p = &value; mysql = mysql_init(NULL); stmt = mysql_stmt_init(mysql); printf("flag=%p other=%p\n", flag_p, other_p); mysql_stmt_attr_get(stmt, STMT_ATTR_UPDATE_MAX_LENGTH, &flag); printf("flag=%p other=%p\n", flag_p, other_p); printf("%i\n", flag); } On my platform, this displays: flag=0xbfbff817 other=0xbfbff81c flag=0xbfbff817 other=0xbf000000 0 Notice how (due to byte ordering), the other_p value gets stomped on. Suggested fix: Either change mysql_stmt_attr_get for STMT_ATTR_UPDATE_MAX_LENGTH to: *(my_bool*) value= stmt->update_max_length; or clarify the documentation that the data types for mysql_stmt_attr_get are not the same as mysql_stmt_attr_set. Currently it says: "If the option is an integer, then arg should point to the value of the integer." This leads one to believe that you should pass in a pointer to an integer *only if* the argument should be an integer which in this case it is not.