mirror of
https://github.com/php/php-src.git
synced 2024-09-23 19:07:26 +00:00
fix #39125 (Memleak when reflecting non-existing class/method)
This commit is contained in:
parent
7154dd7b87
commit
a92a070353
@ -2180,6 +2180,7 @@ ZEND_METHOD(reflection_method, __construct)
|
||||
}
|
||||
/* FIXME: Unicode support??? */
|
||||
if ((tmp = strstr(name_str.s, "::")) == NULL) {
|
||||
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Invalid method name %s", name_str);
|
||||
return;
|
||||
}
|
||||
type = IS_STRING;
|
||||
@ -2203,6 +2204,9 @@ ZEND_METHOD(reflection_method, __construct)
|
||||
if (zend_u_lookup_class(Z_TYPE_P(classname), Z_UNIVAL_P(classname), Z_UNILEN_P(classname), &pce TSRMLS_CC) == FAILURE) {
|
||||
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
|
||||
"Class %v does not exist", Z_UNIVAL_P(classname));
|
||||
if (classname == &ztmp) {
|
||||
zval_dtor(&ztmp);
|
||||
}
|
||||
return;
|
||||
}
|
||||
ce = *pce;
|
||||
@ -2213,6 +2217,9 @@ ZEND_METHOD(reflection_method, __construct)
|
||||
break;
|
||||
|
||||
default:
|
||||
if (classname == &ztmp) {
|
||||
zval_dtor(&ztmp);
|
||||
}
|
||||
_DO_THROW("The parameter class is expected to be either a string or an object");
|
||||
/* returns out of this function */
|
||||
}
|
||||
|
39
ext/reflection/tests/009.phpt
Executable file
39
ext/reflection/tests/009.phpt
Executable file
@ -0,0 +1,39 @@
|
||||
--TEST--
|
||||
ReflectionMethod::__construct() tests
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$a = array("", 1, "::", "a::", "::b", "a::b");
|
||||
|
||||
foreach ($a as $val) {
|
||||
try {
|
||||
new ReflectionMethod($val);
|
||||
} catch (Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
$a = array("", 1, "");
|
||||
$b = array("", "", 1);
|
||||
|
||||
foreach ($a as $key=>$val) {
|
||||
try {
|
||||
new ReflectionMethod($val, $b[$key]);
|
||||
} catch (Exception $e) {
|
||||
var_dump($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
echo "Done\n";
|
||||
?>
|
||||
--EXPECTF--
|
||||
string(20) "Invalid method name "
|
||||
string(21) "Invalid method name 1"
|
||||
string(21) "Class does not exist"
|
||||
string(22) "Class a does not exist"
|
||||
string(21) "Class does not exist"
|
||||
string(22) "Class a does not exist"
|
||||
string(21) "Class does not exist"
|
||||
string(66) "The parameter class is expected to be either a string or an object"
|
||||
string(21) "Class does not exist"
|
||||
Done
|
@ -47,5 +47,5 @@ Done
|
||||
unicode(1) "C"
|
||||
unicode(1) "B"
|
||||
unicode(1) "A"
|
||||
unicode(4) "Test2"
|
||||
unicode(5) "Test2"
|
||||
Done
|
||||
|
Loading…
Reference in New Issue
Block a user