Fix usage of casted string in ReflectionParameter ctor

Fixes oss-fuzz #27755.
This commit is contained in:
Nikita Popov 2020-11-24 16:41:18 +01:00
parent d016434ad3
commit 706241f82d
2 changed files with 20 additions and 2 deletions

View file

@ -2306,10 +2306,10 @@ ZEND_METHOD(reflection_parameter, __construct)
/* nothing to do. don't set is_closure since is the invoke handler, /* nothing to do. don't set is_closure since is the invoke handler,
not the closure itself */ not the closure itself */
} else if ((fptr = zend_hash_find_ptr(&ce->function_table, lcname)) == NULL) { } else if ((fptr = zend_hash_find_ptr(&ce->function_table, lcname)) == NULL) {
zend_throw_exception_ex(reflection_exception_ptr, 0,
"Method %s::%s() does not exist", ZSTR_VAL(ce->name), ZSTR_VAL(name));
zend_string_release(name); zend_string_release(name);
zend_string_release(lcname); zend_string_release(lcname);
zend_throw_exception_ex(reflection_exception_ptr, 0,
"Method %s::%s() does not exist", ZSTR_VAL(ce->name), Z_STRVAL_P(method));
return; return;
} }
zend_string_release(name); zend_string_release(name);

View file

@ -0,0 +1,18 @@
--TEST--
Test method name string cast in ReflectionParameter ctor
--FILE--
<?php
class A {}
try {
new ReflectionParameter([
A::class,
new class { public function __toString() { return 'method'; } }
], 'param');
} catch (ReflectionException $e) {
echo $e->getMessage(), "\n";
}
?>
--EXPECT--
Method A::method() does not exist