Edit report at https://bugs.php.net/bug.php?id=62384&edit=1
ID: 62384
User updated by: alexander dot carver at gmail dot com
Reported by: alexander dot carver at gmail dot com
Summary: Attempting to invoke a Closure more than once causes
segfault
Status: Open
Type: Bug
Package: Reflection related
Operating System: Debian 6.0
-PHP Version: 5.4.4
+PHP Version: 5.3.14
Block user comment: N
Private report: N
New Comment:
Wrong version number, sorry.
Previous Comments:
------------------------------------------------------------------------
[2012-06-21 23:08:39] alexander dot carver at gmail dot com
Description:
------------
The code below should be fairly self-explanatory. Invoking a reflection of the
__invoke method of the Closure class more than once per reflection instance
causes a segfault. This happens regardless of context or argument parameters
passed to ReflectionMethod::invokeArgs(). Can't imagine this is a common use
case
but thought I'd share anyway.
PHP Version is 5.3.14.
I don't have php configured to get a backtrace at the moment, and my .ini is
pretty average. If you can't reproduce it with the script below I'll look into
it
more.
php5 -m :
[PHP Modules]
apc
bcmath
bz2
calendar
Core
ctype
curl
date
dba
dom
ereg
exif
fileinfo
filter
ftp
gd
gettext
hash
iconv
json
libxml
mbstring
mhash
mysql
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
readline
Reflection
session
shmop
SimpleXML
soap
sockets
SPL
SQLite
sqlite3
ssh2
standard
sysvmsg
sysvsem
sysvshm
tokenizer
wddx
xdebug
xml
xmlreader
xmlwriter
yaml
zip
zlib
[Zend Modules]
Xdebug
Test script:
---------------
<?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');
// Invoking once is OK...
print $reflection_method->invokeArgs($closure1, $arguments1);
if(true){
// But don't do it again!
#print $reflection_method->invokeArgs($closure1, $arguments1);
// Using different arguments per invokation makes no difference :(
#print $reflection_method->invokeArgs($closure1, $arguments2);
// Doesn't matter if you attempt to invoke a different closure with the
same reflection.
print $reflection_method->invokeArgs($closure2, $arguments1);
}
?>
Expected result:
----------------
"helloworld" printed
Actual result:
--------------
Segmentationfault
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=62384&edit=1