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