]> granicus.if.org Git - php/commitdiff
Fixed bug #51347 mysqli_close / connection memory leak
authorAndrey Hristov <andrey@php.net>
Thu, 1 Apr 2010 11:50:24 +0000 (11:50 +0000)
committerAndrey Hristov <andrey@php.net>
Thu, 1 Apr 2010 11:50:24 +0000 (11:50 +0000)
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().

ext/mysqlnd/mysqlnd_net.c

index 8f4c46e9dfe9e18793e9689dc47232d917ac70ff..7db43d3ea5c49efb3d9705dfcdac62ec4629580f 100644 (file)
@@ -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);