diff --git a/NEWS b/NEWS index 0e0a6652d4f..0bb5fe988a5 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,8 @@ PHP NEWS - Core: . Fixed line number of JMP instruction over else block. (ilutov) . Fixed use-of-uninitialized-value with ??= on assert. (ilutov) + . Fixed bug GH-11601 (Incorrect handling of unwind and graceful exit + exceptions). (ilutov) - OpenSSL . Added support for additional EC parameters in openssl_pkey_new. (Eno-CN) diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index ed062958f50..7dcf2ad65b7 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -199,8 +199,14 @@ ZEND_API ZEND_COLD void zend_throw_exception_internal(zend_object *exception) /* return; } if (EG(exception)) { - if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) { + if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF + && !zend_is_unwind_exit(EG(exception)) + && !zend_is_graceful_exit(EG(exception))) { zend_user_exception_handler(); + if (EG(exception)) { + zend_exception_error(EG(exception), E_ERROR); + } + return; } else { zend_exception_error(EG(exception), E_ERROR); } diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index dfb13005f64..c1a5e31f7e6 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -1010,11 +1010,7 @@ cleanup_args: if (UNEXPECTED(EG(exception))) { if (UNEXPECTED(!EG(current_execute_data))) { - if (Z_TYPE(EG(user_exception_handler)) != IS_UNDEF) { - zend_user_exception_handler(); - } else { - zend_throw_exception_internal(NULL); - } + zend_throw_exception_internal(NULL); } else if (EG(current_execute_data)->func && ZEND_USER_CODE(EG(current_execute_data)->func->common.type)) { zend_rethrow_exception(EG(current_execute_data));