From: Antony Dovgal Date: Thu, 31 Mar 2011 11:59:34 +0000 (+0000) Subject: fix bug #54423 (classes from dl()'ed extensions are not destroyed) X-Git-Tag: php-5.3.7RC1~200 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dd5781bcdf0d5514210de90b10167be6e40157f1;p=php fix bug #54423 (classes from dl()'ed extensions are not destroyed) --- diff --git a/NEWS b/NEWS index 0169ec3af6..d233f08442 100644 --- 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) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index e79d951df2..261170c41e 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -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) {