From: Bob Weinand Date: Fri, 26 Jun 2015 03:10:58 +0000 (+0200) Subject: Fix Closure leak in aborted INIT_DYNAMIC_FCALL X-Git-Tag: php-7.1.0alpha3~25^2~175^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1335ebd0681f821ac143fb65daf78807fc619b8b;p=php Fix Closure leak in aborted INIT_DYNAMIC_FCALL --- 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 0000000000..07374c78f4 --- /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 8fc40245c9..e80f42992d 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);