From db66526c951726e3ababeb773708a3fd1a750549 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 10 Feb 2008 23:41:57 +0400 Subject: [PATCH] Bug #33796 Memory leak for prepared statements in embedded server. Field data for a query was stored to the stmt->alloc that is emptied with mysql_stmt_close statement only. That means a lot of memory can be occupied without a reason if used doesn't call mysql_stmt_close often. libmysql/libmysql.c: Bug #33796 Memory leak for prepared statements in embedded server. Clean up result->alloc even if there's no 'data' created libmysqld/lib_sql.cc: Bug #33796 Memory leak for prepared statements in embedded server. alloc 'fields' in the 'result.alloc' as the 'mem_root' is only cleaned with mysql_stmt_close' --- libmysql/libmysql.c | 13 +++++-------- libmysqld/lib_sql.cc | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index e963c0e429c..6916c643f6c 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -4522,14 +4522,11 @@ my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt) { MYSQL *mysql= stmt->mysql; - if (result->data) - { - /* Result buffered */ - free_root(&result->alloc, MYF(MY_KEEP_PREALLOC)); - result->data= NULL; - result->rows= 0; - stmt->data_cursor= NULL; - } + /* Result buffered */ + free_root(&result->alloc, MYF(MY_KEEP_PREALLOC)); + result->data= NULL; + result->rows= 0; + stmt->data_cursor= NULL; if (mysql && stmt->field_count && (int) stmt->state > (int) MYSQL_STMT_PREPARE_DONE) diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 7f2059db7cd..0665641d3b6 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -668,7 +668,7 @@ bool Protocol::send_fields(List *list, uint flag) DBUG_RETURN(0); field_count= list->elements; - field_alloc= thd->current_stmt ? &thd->current_stmt->mem_root : + field_alloc= thd->current_stmt ? &thd->current_stmt->result.alloc : &mysql->field_alloc; if (!(client_field= mysql->fields= (MYSQL_FIELD *)alloc_root(field_alloc,