]> granicus.if.org Git - php/commitdiff
try not to crash when closing persistent sockets, because EG(persistent_list)
authorAndrey Hristov <andrey@php.net>
Thu, 6 Oct 2011 00:45:58 +0000 (00:45 +0000)
committerAndrey Hristov <andrey@php.net>
Thu, 6 Oct 2011 00:45:58 +0000 (00:45 +0000)
is cleaned before the extensions' MSHUTDOWNs are called.

ext/mysqlnd/mysqlnd_net.c

index 15a539fdb99eb24321e7bd56665fbf9d7e476abb..b558ce3af43c678bbf1ee68b6078a1d9b4cc252b 100644 (file)
@@ -932,7 +932,15 @@ mysqlnd_net_free(MYSQLND_NET * const net TSRMLS_DC)
                if (net->stream) {
                        DBG_INF_FMT("Freeing stream. abstract=%p", net->stream->abstract);
                        if (pers) {
-                               php_stream_free(net->stream, PHP_STREAM_FREE_CLOSE_PERSISTENT | PHP_STREAM_FREE_RSRC_DTOR);
+                               if (EG(active)) {
+                                       php_stream_free(net->stream, PHP_STREAM_FREE_CLOSE_PERSISTENT | PHP_STREAM_FREE_RSRC_DTOR);
+                               } else {
+                                       /*
+                                         otherwise we will crash because the EG(persistent_list) has been freed already,
+                                         before the modules are shut down
+                                       */
+                                       php_stream_free(net->stream, PHP_STREAM_FREE_CLOSE | PHP_STREAM_FREE_RSRC_DTOR);
+                               }
                        } else {
                                php_stream_free(net->stream, PHP_STREAM_FREE_CLOSE);
                        }