From 5855e35b01f1d8a7462612731915c6e62aac93ff Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Wed, 20 Feb 2008 15:20:14 +0000 Subject: [PATCH] Fix memory leak --- ext/mysqlnd/mysqlnd_result.c | 12 ++++++------ ext/mysqlnd/mysqlnd_wireprotocol.c | 3 +++ ext/mysqlnd/mysqlnd_wireprotocol.h | 2 ++ 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_result.c b/ext/mysqlnd/mysqlnd_result.c index 135216a19e..f987ffba65 100644 --- a/ext/mysqlnd/mysqlnd_result.c +++ b/ext/mysqlnd/mysqlnd_result.c @@ -336,6 +336,12 @@ MYSQLND_METHOD(mysqlnd_res, free_result_buffers)(MYSQLND_RES *result TSRMLS_DC) result->lengths = NULL; } + if (result->row_packet) { + DBG_INF("Freeing packet"); + PACKET_FREE(result->row_packet); + result->row_packet = NULL; + } + DBG_VOID_RETURN; } /* }}} */ @@ -349,12 +355,6 @@ void mysqlnd_internal_free_result_contents(MYSQLND_RES *result TSRMLS_DC) result->m.free_result_buffers(result TSRMLS_CC); - if (result->row_packet) { - DBG_INF("Freeing packet"); - PACKET_FREE(result->row_packet); - result->row_packet = NULL; - } - if (result->meta) { result->meta->m->free_metadata(result->meta, FALSE TSRMLS_CC); result->meta = NULL; diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index c030d711f9..722d519021 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1672,11 +1672,13 @@ end: static void php_mysqlnd_rowp_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) { + DBG_ENTER("php_mysqlnd_rowp_free_mem"); php_mysql_packet_row *p= (php_mysql_packet_row *) _packet; if (p->row_buffer) { p->row_buffer->free_chunk(p->row_buffer, TRUE TSRMLS_CC); p->row_buffer = NULL; } + DBG_INF_FMT("alloca=%d persistent=%d", (int)alloca, (int)p->header.persistent); /* Don't free packet->fields : - normal queries -> store_result() | fetch_row_unbuffered() will transfer @@ -1687,6 +1689,7 @@ void php_mysqlnd_rowp_free_mem(void *_packet, zend_bool alloca TSRMLS_DC) if (!alloca) { mnd_pefree(p, p->header.persistent); } + DBG_VOID_RETURN; } /* }}} */ diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.h b/ext/mysqlnd/mysqlnd_wireprotocol.h index ca2a4640e3..d27baac85b 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.h +++ b/ext/mysqlnd/mysqlnd_wireprotocol.h @@ -42,11 +42,13 @@ extern char * mysqlnd_read_body_name; packet = (c_type) pecalloc(1, packet_methods[(enum_type)].struct_size, (pers)); \ ((c_type) (packet))->header.m = &packet_methods[(enum_type)]; \ ((c_type) (packet))->header.persistent = (pers); \ + DBG_INF_FMT("PACKET_INIT(%p, %d, %d)", packet, (int) enum_type, (int) pers); \ } #define PACKET_WRITE(packet, conn) ((packet)->header.m->write_to_net((packet), (conn) TSRMLS_CC)) #define PACKET_READ(packet, conn) ((packet)->header.m->read_from_net((packet), (conn) TSRMLS_CC)) #define PACKET_FREE(packet) \ do { \ + DBG_INF_FMT("PACKET_FREE(%p)", packet); \ ((packet)->header.m->free_mem((packet), FALSE TSRMLS_CC)); \ } while (0); -- 2.40.0