diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-08-28 17:04:55 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-08-28 17:04:55 +0200 |
commit | 6323c13e74eb63cf03e11a36c68f4fdf2077872a (patch) | |
tree | 14ac20ccd7138d2d7e3bb6b0b4ef632d710f600e /Zend/zend_execute_API.c | |
parent | afb69b6f2d4872d6b916c10d7d394ca304481865 (diff) | |
parent | c45f19590c4d442c0ecf5a3b55cd0fb928243e6a (diff) | |
download | php-git-6323c13e74eb63cf03e11a36c68f4fdf2077872a.tar.gz |
Merge branch 'PHP-7.4'
Diffstat (limited to 'Zend/zend_execute_API.c')
-rw-r--r-- | Zend/zend_execute_API.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index 1465e9afd3..ac95aa5cc3 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -316,6 +316,21 @@ void shutdown_executor(void) /* {{{ */ } } ZEND_HASH_FOREACH_END(); + /* Also release error and exception handlers, which may hold objects. */ + if (Z_TYPE(EG(user_error_handler)) != IS_UNDEF) { + zval_ptr_dtor(&EG(user_error_handler)); + ZVAL_UNDEF(&EG(user_error_handler)); + } + + if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) { + zval_ptr_dtor(&EG(user_exception_handler)); + ZVAL_UNDEF(&EG(user_exception_handler)); + } + + zend_stack_clean(&EG(user_error_handlers_error_reporting), NULL, 1); + zend_stack_clean(&EG(user_error_handlers), (void (*)(void *))ZVAL_PTR_DTOR, 1); + zend_stack_clean(&EG(user_exception_handlers), (void (*)(void *))ZVAL_PTR_DTOR, 1); + #if ZEND_DEBUG if (gc_enabled() && !CG(unclean_shutdown)) { gc_collect_cycles(); @@ -342,22 +357,6 @@ void shutdown_executor(void) /* {{{ */ zend_hash_discard(EG(class_table), EG(persistent_classes_count)); zend_cleanup_internal_classes(); } else { - /* remove error handlers before destroying classes and functions, - * so that if handler used some class, crash would not happen */ - if (Z_TYPE(EG(user_error_handler)) != IS_UNDEF) { - zval_ptr_dtor(&EG(user_error_handler)); - ZVAL_UNDEF(&EG(user_error_handler)); - } - - if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) { - zval_ptr_dtor(&EG(user_exception_handler)); - ZVAL_UNDEF(&EG(user_exception_handler)); - } - - zend_stack_clean(&EG(user_error_handlers_error_reporting), NULL, 1); - zend_stack_clean(&EG(user_error_handlers), (void (*)(void *))ZVAL_PTR_DTOR, 1); - zend_stack_clean(&EG(user_exception_handlers), (void (*)(void *))ZVAL_PTR_DTOR, 1); - zend_vm_stack_destroy(); if (EG(full_tables_cleanup)) { |