From b8e946b02eac53f46cbfc8eefb5c91fb5b075c9d Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 22 Jun 2012 12:05:29 -0300 Subject: - Fixed bug #62384 (Attempting to invoke a Closure more than once causes segfaul) --- ext/reflection/php_reflection.c | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'ext/reflection/php_reflection.c') diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index ca90269fcd..966c9a5448 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -2747,6 +2747,16 @@ ZEND_METHOD(reflection_method, invokeArgs) fcc.calling_scope = obj_ce; fcc.called_scope = intern->ce; fcc.object_ptr = object; + + /* + * Closure::__invoke() actually expects a copy of zend_function, so that it + * frees it after the invoking. + */ + if (obj_ce == zend_ce_closure && object && + strlen(mptr->common.function_name) == sizeof(ZEND_INVOKE_FUNC_NAME)-1 && + memcmp(mptr->common.function_name, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1) == 0) { + fcc.function_handler = _copy_function(mptr TSRMLS_CC); + } result = zend_call_function(&fci, &fcc TSRMLS_CC); -- cgit v1.2.1 From c3f34796a053f5ff1016d872f8c339e32468783f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 23 Jun 2012 15:10:47 -0300 Subject: - Improved fix for #62384 --- ext/reflection/php_reflection.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'ext/reflection/php_reflection.c') diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 966c9a5448..180ce8f91a 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -2749,12 +2749,10 @@ ZEND_METHOD(reflection_method, invokeArgs) fcc.object_ptr = object; /* - * Closure::__invoke() actually expects a copy of zend_function, so that it - * frees it after the invoking. + * Copy the zend_function when calling via handler (e.g. Closure::__invoke()) */ - if (obj_ce == zend_ce_closure && object && - strlen(mptr->common.function_name) == sizeof(ZEND_INVOKE_FUNC_NAME)-1 && - memcmp(mptr->common.function_name, ZEND_INVOKE_FUNC_NAME, sizeof(ZEND_INVOKE_FUNC_NAME)-1) == 0) { + if (mptr->type == ZEND_INTERNAL_FUNCTION && + (mptr->internal_function.fn_flags & ZEND_ACC_CALL_VIA_HANDLER) != 0) { fcc.function_handler = _copy_function(mptr TSRMLS_CC); } -- cgit v1.2.1