summaryrefslogtreecommitdiff
path: root/Zend/zend_exceptions.c
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-10-13 11:38:30 +0200
committerNikita Popov <nikita.ppv@gmail.com>2020-10-13 11:43:43 +0200
commit1748b8111e97f14f709553c7a5498fcdfcd6c754 (patch)
tree49d6c366ef8fab4a929e4ef239af6407ecdc6e89 /Zend/zend_exceptions.c
parent8c68745f432a6039a9dd35a115bcf5c67a340d2a (diff)
downloadphp-git-1748b8111e97f14f709553c7a5498fcdfcd6c754.tar.gz
Fix handling of throwing undef var in verify return
If we have an undefined variable and null is not accepted by the return type, we want to throw just the undef var error. In this case this lead to an infinite loop, because we overwrite the exception opline in SAVE_OPLINE and it does not get reset when chaining into a previous exception. Add an assertiong to catch this case earlier.
Diffstat (limited to 'Zend/zend_exceptions.c')
-rw-r--r--Zend/zend_exceptions.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c
index f037f0399a..b52b1ab113 100644
--- a/Zend/zend_exceptions.c
+++ b/Zend/zend_exceptions.c
@@ -144,6 +144,13 @@ void zend_exception_restore(void) /* {{{ */
}
/* }}} */
+static zend_always_inline zend_bool is_handle_exception_set() {
+ zend_execute_data *execute_data = EG(current_execute_data);
+ return !execute_data->func
+ || !ZEND_USER_CODE(execute_data->func->common.type)
+ || execute_data->opline->opcode == ZEND_HANDLE_EXCEPTION;
+}
+
ZEND_API ZEND_COLD void zend_throw_exception_internal(zend_object *exception) /* {{{ */
{
#ifdef HAVE_DTRACE
@@ -161,6 +168,7 @@ ZEND_API ZEND_COLD void zend_throw_exception_internal(zend_object *exception) /*
zend_exception_set_previous(exception, EG(exception));
EG(exception) = exception;
if (previous) {
+ ZEND_ASSERT(is_handle_exception_set() && "HANDLE_EXCEPTION not set?");
return;
}
}
@@ -179,9 +187,7 @@ ZEND_API ZEND_COLD void zend_throw_exception_internal(zend_object *exception) /*
zend_throw_exception_hook(exception);
}
- if (!EG(current_execute_data)->func ||
- !ZEND_USER_CODE(EG(current_execute_data)->func->common.type) ||
- EG(current_execute_data)->opline->opcode == ZEND_HANDLE_EXCEPTION) {
+ if (is_handle_exception_set()) {
/* no need to rethrow the exception */
return;
}