diff --git a/Zend/tests/closure_call_leak_with_exception.phpt b/Zend/tests/closure_call_leak_with_exception.phpt new file mode 100644 index 00000000000..07374c78f46 --- /dev/null +++ b/Zend/tests/closure_call_leak_with_exception.phpt @@ -0,0 +1,14 @@ +--FILE-- +Closure must not leak during a dynmaic call interrupted by an exception +--TEST-- +valid(); // start + +?> +==DONE== +--EXPECT-- +==DONE== diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 8fc40245c95..e80f42992de 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2486,6 +2486,9 @@ static zend_always_inline void i_cleanup_unfinished_execution(zend_execute_data } OBJ_RELEASE(Z_OBJ(call->This)); } + if (call->func->common.fn_flags & ZEND_ACC_CLOSURE) { + zend_object_release(call->func->common.prototype); + } if (call->func->common.fn_flags & ZEND_ACC_CALL_VIA_TRAMPOLINE) { zend_string_release(call->func->common.function_name); zend_free_trampoline(call->func);