Hi,

Does anyone agree that there is an issue to fix here? Messing with the shutdown order is probably the last thing any RM would like to see happening ..

regards,
Lukas

On 16.06.2008, at 04:55, Gregory Beaver wrote:

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

Lukas Kahwe Smith
[EMAIL PROTECTED]




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

Reply via email to