diff options
author | Stanislav Malyshev <stas@php.net> | 2014-09-01 12:11:42 -0700 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2014-09-01 12:11:42 -0700 |
commit | 197095c29ecd643a9d8c8187fa9e87a6d92ceacd (patch) | |
tree | 22efa8f0e8a187e8b18c0731284eae24e6c40121 | |
parent | e665a07ab9b784266eefa9af30d8a32fa199da0b (diff) | |
parent | 437612f65615a93fe338fd5c25acb82d3e81a6f7 (diff) | |
download | php-git-197095c29ecd643a9d8c8187fa9e87a6d92ceacd.tar.gz |
Merge branch 'pull-request/770' into PHP-5.4
* pull-request/770:
Only destruct if EG(active) in zend_shutdown(). (bug #65463, #66036)
Fix typo from commit 32314f6b6
Fix destruction order in zend_shutdown (bug #65463, #66036)
-rw-r--r-- | Zend/zend.c | 14 | ||||
-rw-r--r-- | Zend/zend_compile.h | 2 | ||||
-rw-r--r-- | Zend/zend_execute_API.c | 4 |
3 files changed, 18 insertions, 2 deletions
diff --git a/Zend/zend.c b/Zend/zend.c index 1189875f37..6d74ca6890 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -813,6 +813,20 @@ void zend_shutdown(TSRMLS_D) /* {{{ */ zend_shutdown_timeout_thread(); #endif zend_destroy_rsrc_list(&EG(persistent_list) TSRMLS_CC); + + if (EG(active)) + { + /* + * The order of destruction is important here. + * See bugs #65463 and 66036. + */ + zend_hash_reverse_apply(GLOBAL_FUNCTION_TABLE, (apply_func_t) zend_cleanup_function_data_full TSRMLS_CC); + zend_hash_reverse_apply(GLOBAL_CLASS_TABLE, (apply_func_t) zend_cleanup_user_class_data TSRMLS_CC); + zend_cleanup_internal_classes(TSRMLS_C); + zend_hash_reverse_apply(GLOBAL_FUNCTION_TABLE, (apply_func_t) clean_non_persistent_function_full TSRMLS_CC); + zend_hash_reverse_apply(GLOBAL_CLASS_TABLE, (apply_func_t) clean_non_persistent_class_full TSRMLS_CC); + } + zend_destroy_modules(); zend_hash_destroy(GLOBAL_FUNCTION_TABLE); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 1490307df4..156dc8975b 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -639,6 +639,8 @@ ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce TSRMLS_DC); ZEND_API void zend_cleanup_internal_classes(TSRMLS_D); ZEND_API int zend_cleanup_function_data(zend_function *function TSRMLS_DC); ZEND_API int zend_cleanup_function_data_full(zend_function *function TSRMLS_DC); +ZEND_API int clean_non_persistent_function_full(zend_function *function TSRMLS_DC); +ZEND_API int clean_non_persistent_class_full(zend_class_entry **ce TSRMLS_DC); ZEND_API void destroy_zend_function(zend_function *function TSRMLS_DC); ZEND_API void zend_function_dtor(zend_function *function); diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index e79abdc944..55ef32313f 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -108,7 +108,7 @@ static int clean_non_persistent_function(zend_function *function TSRMLS_DC) /* { } /* }}} */ -static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) /* {{{ */ +ZEND_API int clean_non_persistent_function_full(zend_function *function TSRMLS_DC) /* {{{ */ { return (function->type == ZEND_INTERNAL_FUNCTION) ? ZEND_HASH_APPLY_KEEP : ZEND_HASH_APPLY_REMOVE; } @@ -120,7 +120,7 @@ static int clean_non_persistent_class(zend_class_entry **ce TSRMLS_DC) /* {{{ */ } /* }}} */ -static int clean_non_persistent_class_full(zend_class_entry **ce TSRMLS_DC) /* {{{ */ +ZEND_API int clean_non_persistent_class_full(zend_class_entry **ce TSRMLS_DC) /* {{{ */ { return ((*ce)->type == ZEND_INTERNAL_CLASS) ? ZEND_HASH_APPLY_KEEP : ZEND_HASH_APPLY_REMOVE; } |