]> granicus.if.org Git - php/commitdiff
- Fixed bug #62384 (Attempting to invoke a Closure more than once causes segfaul)
authorFelipe Pena <felipensp@gmail.com>
Fri, 22 Jun 2012 15:05:29 +0000 (12:05 -0300)
committerFelipe Pena <felipensp@gmail.com>
Fri, 22 Jun 2012 15:05:29 +0000 (12:05 -0300)
ext/reflection/php_reflection.c
ext/reflection/tests/bug62384.phpt [new file with mode: 0644]

index ca90269fcde2e5339c5189ae74e5f14d2dcfef48..966c9a5448ecab2ccbd14d74115723761d5f6c0b 100644 (file)
@@ -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 (file)
index 0000000..90a871f
--- /dev/null
@@ -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"