Bug #29687 mysql_stmt_store_result memory leak in libmysqld
| Submitted: | 10 Jul 2007 10:09 | Modified: | 23 Jul 2007 0:47 |
|---|---|---|---|
| Reporter: | Shane Bester (Platinum Quality Contributor) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Prepared statements | Severity: | S1 (Critical) |
| Version: | 5.1.17, 5.1.20 | OS: | Any |
| Assigned to: | Alexey Botchkov | CPU Architecture: | Any |
| Tags: | memory leak, mysql_stmt_store_result | ||
[16 Jul 2007 15:08]
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/30968 ChangeSet@1.2527, 2007-07-16 19:08:07+05:00, holyfoot@mysql.com +1 -0 Bug #29687 mysql_stmt_store_result memory leak in libmysqld In embedded server we use result->alloc to store field data for the result, but we didn't clean the result->alloc if the query returned an empty recordset. Cleaning for the empty recordset enabled
[20 Jul 2007 23:46]
Bugs System
Pushed into 5.1.21-beta
[20 Jul 2007 23:49]
Bugs System
Pushed into 5.0.48
[22 Jul 2007 17:58]
Paul DuBois
Noted in 5.0.48, 5.1.21 changelogs. The mysql_stmt_store_result() C API function caused a memory leak for empty result sets.
[22 Jul 2007 18:31]
Sergei Golubchik
in the embedded server - libmysqld - only
[23 Jul 2007 0:47]
Paul DuBois
Updated changelog to note embedded-server only.
Portions of this website are copyright © 2001, 2002 The PHP Group
Page generated in 0.057 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: when calling mysql_stmt_store_result and there is no resultset to retrieve, a memory leak occurs. How to repeat: A test program: /* g++ -c -Wall -I/home/sbester/server/5.1/mysql-5.1.17-beta-linux-i686-glibc23/include leaker.c g++ -Wall -pthread -ldl -o leaker leaker.o /home/sbester/server/5.1/mysql-5.1.17-beta-linux-i686-glibc23/lib/libmysqld.a /usr/lib/libcrypt.a /usr/lib/libz.a */ #include <stdio.h> #include <unistd.h> #include <string.h> #include "mysql.h" static char *server_args[] = { "this_program", /* this string is not used */ "--basedir=/home/sbester/server/5.1/mysql-5.1.17-beta-linux-i686-glibc23/", "--key_buffer_size=32M" }; static char *server_groups[] = { "embedded", "server", "this_program_SERVER", (char *)NULL }; int main(int argc, char** argv) { MYSQL *m; MYSQL_STMT *s; char sql[]="SELECT 1 FROM dual WHERE 0=2"; if (mysql_library_init(sizeof(server_args) / sizeof(char *),server_args, server_groups)) { fprintf(stderr, "could not initialize MySQL library\n"); return 1; } m= mysql_init(NULL); mysql_real_connect(m,"","","","",0,NULL,0); s= mysql_stmt_init(m); mysql_stmt_prepare(s, sql, strlen(sql)); while(1) { mysql_stmt_execute(s); mysql_stmt_store_result(s); while (mysql_stmt_fetch(s)==0); mysql_stmt_free_result(s); } mysql_stmt_close(s); return 0; return 0; } Suggested fix: don't leak.