From: Dmitry Stogov Date: Wed, 1 Oct 2008 07:30:52 +0000 (+0000) Subject: Fixed bug #46205 (Closure - Memory leaks when ReflectionException is thrown) X-Git-Tag: BEFORE_HEAD_NS_CHANGE~309 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=292016006eeb07d1edc6bcfedead5d2911c2c17a;p=php Fixed bug #46205 (Closure - Memory leaks when ReflectionException is thrown) --- diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 2434fae25b..ae3b802dfa 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -2005,6 +2005,12 @@ ZEND_METHOD(reflection_parameter, __construct) if (Z_TYPE_PP(parameter) == IS_LONG) { position= Z_LVAL_PP(parameter); if (position < 0 || (zend_uint)position >= fptr->common.num_args) { + if (fptr->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) { + if (fptr->type != ZEND_OVERLOADED_FUNCTION) { + efree(fptr->common.function_name.v); + } + efree(fptr); + } _DO_THROW("The parameter specified by its offset could not be found"); /* returns out of this function */ } @@ -2023,6 +2029,12 @@ ZEND_METHOD(reflection_parameter, __construct) } } if (position == -1) { + if (fptr->common.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) { + if (fptr->type != ZEND_OVERLOADED_FUNCTION) { + efree(fptr->common.function_name.v); + } + efree(fptr); + } _DO_THROW("The parameter specified by its name could not be found"); /* returns out of this function */ } diff --git a/ext/reflection/tests/bug46205.phpt b/ext/reflection/tests/bug46205.phpt new file mode 100644 index 0000000000..ef7a692cb7 --- /dev/null +++ b/ext/reflection/tests/bug46205.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #46205 (Closure - Memory leaks when ReflectionException is thrown) +--FILE-- +invokeArgs(new reflectionparameter('trim', 'str'), array($y, 1)); +} catch (Exception $e) { } +?> +ok +--EXPECT-- +ok