From 1335ebd0681f821ac143fb65daf78807fc619b8b Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 26 Jun 2015 05:10:58 +0200 Subject: [PATCH] Fix Closure leak in aborted INIT_DYNAMIC_FCALL --- Zend/tests/closure_call_leak_with_exception.phpt | 14 ++++++++++++++ Zend/zend_execute.c | 3 +++ 2 files changed, 17 insertions(+) create mode 100644 Zend/tests/closure_call_leak_with_exception.phpt 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); -- 2.50.1