zenovich / runkit

Runkit (official PECL PHP Runkit extension)
http://pecl.php.net/runkit
Other
611 stars 136 forks source link

ReflectionFunction + runkit segfaults #30

Closed tony2001 closed 12 years ago

tony2001 commented 12 years ago

Самый простой тест-кейс: <? function foo($arg) {} $rf = new ReflectionFunction("foo"); runkit_function_remove("foo"); $rf->invokeArgs(array("test")); ?>

Вариация на тему: <? function foo($arg) {} $rf = new ReflectionFunction("foo"); runkit_function_redefine("foo", '$arg1', 'var_dump("new implementation - $arg1");'); $rf->invokeArgs(array("test")); ?>

Чуть сложнее: <? function foo($arg) {} $rp = new ReflectionParameter("foo", "arg"); runkit_function_redefine("foo", '$arg1', 'var_dump("new implementation - $arg1");'); var_dump($rp->getDeclaringFunction()); var_dump((string)$rp); ?>

Всё, в общем, логично - reflection хранит старый указатель, а runkit ему делает free (верней, zend_hash_update()) и подменяет его другим.

zenovich commented 12 years ago

fixed