From 311ab2c822e0a14a8785d8889953d7f8a744d4f6 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Thu, 1 Apr 2010 11:50:24 +0000 Subject: [PATCH] Fixed bug #51347 mysqli_close / connection memory leak Streams API registers every stream as resource, which lands then in EG(regular_list), however doesn't clean that when the stream is closed. At the end this is a para-leak. At the end of the script all memory is cleaned, however this is a problem for long runnig scripts that open connections. For every opened and closed connection about 150 Bytes on 32bit and 250 Bytes on 64bit will be "lost", according to memory_get_usage(). --- NEWS | 1 + ext/mysqlnd/mysqlnd_net.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/NEWS b/NEWS index 8018b0aa53..014d3d3ad6 100644 --- a/NEWS +++ b/NEWS @@ -13,6 +13,7 @@ PHP NEWS - Fixed bug #51393 (DateTime::createFromFormat() fails if format string contains timezone). (Adam) +- Fixed bug #51347 (mysqli_close / connection memory leak). (Andrey, Johannes) - Fixed bug #51338 (URL-Rewriter is still enabled if use_only_cookies is on). (Ilia, j dot jeising at gmail dot com) - Fixed bug #51269 (zlib.output_compression Overwrites Vary Header). (Adam) diff --git a/ext/mysqlnd/mysqlnd_net.c b/ext/mysqlnd/mysqlnd_net.c index 8f4c46e9df..7db43d3ea5 100644 --- a/ext/mysqlnd/mysqlnd_net.c +++ b/ext/mysqlnd/mysqlnd_net.c @@ -703,6 +703,14 @@ mysqlnd_net_free(MYSQLND_NET * const net TSRMLS_DC) mnd_pefree(net->cmd_buffer.buffer, pers); net->cmd_buffer.buffer = NULL; } + /* + Streams are not meant for C extensions! Thus we need a hack. Every connected stream will + be registered as resource (in EG(regular_list). So far, so good. However, it won't be + unregistered till the script ends. So, we need to take care of that. + */ + net->stream->in_free = 1; + zend_hash_index_del(&EG(regular_list), net->stream->rsrc_id); + net->stream->in_free = 0; if (net->stream) { DBG_INF_FMT("Freeing stream. abstract=%p", net->stream->abstract); -- 2.40.0