]> granicus.if.org Git - php/commitdiff
fix bug #54423 (classes from dl()'ed extensions are not destroyed)
authorAntony Dovgal <tony2001@php.net>
Thu, 31 Mar 2011 11:59:34 +0000 (11:59 +0000)
committerAntony Dovgal <tony2001@php.net>
Thu, 31 Mar 2011 11:59:34 +0000 (11:59 +0000)
NEWS
Zend/zend_API.c

diff --git a/NEWS b/NEWS
index 0169ec3af6bf2dcfbf17d4f0c5fa5971ec342832..d233f084423beca08fba8075f609670040abae81 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,8 @@ PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2011, PHP 5.3.7
 - Zend Engine:
+  . Fixed bug #54423 (classes from dl()'ed extensions are not destroyed). 
+    (Tony, Dmitry)
   . Fixed bug #54262 (Crash when assigning value to a dimension in a non-array).
     (Dmitry)
 
index e79d951df2b81628794729ae8a607c8e06002c25..261170c41ee653ff631875faa3669520dd3aa2ac 100644 (file)
@@ -2082,6 +2082,22 @@ ZEND_API int zend_get_module_started(const char *module_name) /* {{{ */
 }
 /* }}} */
 
+static int clean_module_class(const zend_class_entry **ce, int *module_number TSRMLS_DC) /* {{{ */
+{
+       if ((*ce)->type == ZEND_INTERNAL_CLASS && (*ce)->module->module_number == *module_number) {
+               return ZEND_HASH_APPLY_REMOVE;
+       } else {
+               return ZEND_HASH_APPLY_KEEP;
+       }
+}
+/* }}} */
+
+static void clean_module_classes(int module_number TSRMLS_DC) /* {{{ */
+{
+       zend_hash_apply_with_argument(EG(class_table), (apply_func_arg_t) clean_module_class, (void *) &module_number TSRMLS_CC);
+}
+/* }}} */
+
 void module_destructor(zend_module_entry *module) /* {{{ */
 {
        TSRMLS_FETCH();
@@ -2089,6 +2105,7 @@ void module_destructor(zend_module_entry *module) /* {{{ */
        if (module->type == MODULE_TEMPORARY) {
                zend_clean_module_rsrc_dtors(module->module_number TSRMLS_CC);
                clean_module_constants(module->module_number TSRMLS_CC);
+               clean_module_classes(module->module_number TSRMLS_CC);
        }
 
        if (module->module_started && module->module_shutdown_func) {