Hi,

I'm getting errors of hashtable already destroyed when running
phpMyAdmin with PHP 5.3, and (of course), thinking this is a phar issue,
I've traced through and found a problem in the shutdown order. 
Basically, php_request_shutdown() calls zend_deactivate() which calls
zend_destroy_rsrc_list(&EG(regular_list)).  On the next line,
zend_post_deactivate_modules() is called, which steps through the module
list and unloads all the dynamically loaded modules.  If one of these
modules (like mysqli) declares a resource type, then in
module_destructor() zend_clean_module_rsrc_dtors() is called, which
calls zend_clean_modules_rsrc_dtors_cb() (zend_list.c:253).

This function then walks over EG(regular_list), which had been
previously destroyed.

I think this issue could be fixed by moving the
zend_destroy_rsrc_list(&EG(regular_list)) call after the module
shutdown.  I've attached a patch demonstrating the principle (this fixes
the hashtable destroyed message and I don't get anything bad like a
segfault).

Could someone with more brains double-check this one?  I think it can be
reproduced with a debug build using mysqli loaded dynamically and any
script that uses mysqli, but I've only reproduced it with phpMyAdmin.

Thanks,
Greg
Index: Zend/zend.c
===================================================================
RCS file: /repository/ZendEngine2/zend.c,v
retrieving revision 1.308.2.12.2.35.2.18
diff -u -r1.308.2.12.2.35.2.18 zend.c
--- Zend/zend.c 29 Apr 2008 08:15:16 -0000      1.308.2.12.2.35.2.18
+++ Zend/zend.c 16 Jun 2008 02:53:00 -0000
@@ -901,7 +901,8 @@
                shutdown_compiler(TSRMLS_C);
        } zend_end_try();
 
-       zend_destroy_rsrc_list(&EG(regular_list) TSRMLS_CC);
+       /* shutdown order issue */
+       /* zend_destroy_rsrc_list(&EG(regular_list) TSRMLS_CC); */
 
 #ifdef ZEND_DEBUG
        if (GC_G(gc_enabled) && !CG(unclean_shutdown)) {
Index: main/main.c
===================================================================
RCS file: /repository/php-src/main/main.c,v
retrieving revision 1.640.2.23.2.57.2.22
diff -u -r1.640.2.23.2.57.2.22 main.c
--- main/main.c 21 May 2008 15:55:31 -0000      1.640.2.23.2.57.2.22
+++ main/main.c 16 Jun 2008 02:53:02 -0000
@@ -1527,6 +1527,8 @@
                zend_post_deactivate_modules(TSRMLS_C);
        } zend_end_try();
 
+       zend_destroy_rsrc_list(&EG(regular_list) TSRMLS_CC);
+
        /* 9. SAPI related shutdown (free stuff) */
        zend_try {
                sapi_deactivate(TSRMLS_C);

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to