Commit: b8e946b02eac53f46cbfc8eefb5c91fb5b075c9d Author: Felipe Pena <felipe...@gmail.com> Fri, 22 Jun 2012 12:05:29 -0300 Parents: 055ecbc62878e86287d742c7246c21606cee8183 Branches: PHP-5.3 PHP-5.4 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=b8e946b02eac53f46cbfc8eefb5c91fb5b075c9d Log: - Fixed bug #62384 (Attempting to invoke a Closure more than once causes segfaul) Bugs: https://bugs.php.net/62384 Changed paths: M ext/reflection/php_reflection.c A ext/reflection/tests/bug62384.phpt Diff: diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index ca90269..966c9a5 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); diff --git a/ext/reflection/tests/bug62384.phpt b/ext/reflection/tests/bug62384.phpt new file mode 100644 index 0000000..90a871f --- /dev/null +++ b/ext/reflection/tests/bug62384.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #62384 (Attempting to invoke a Closure more than once causes segfaul) +--FILE-- +<?php + +$closure1 = function($val){ return $val; }; +$closure2 = function($val){ return $val; }; + +$reflection_class = new ReflectionClass($closure1); +$reflection_method = $reflection_class->getMethod('__invoke'); + +$arguments1 = array('hello'); +$arguments2 = array('world'); + +var_dump($reflection_method->invokeArgs($closure1, $arguments1)); +var_dump($reflection_method->invokeArgs($closure2, $arguments2)); + +?> +--EXPECT-- +string(5) "hello" +string(5) "world" -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php