summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-06-15 15:44:44 +0300
committerDmitry Stogov <dmitry@zend.com>2015-06-15 15:44:44 +0300
commit33e71d5c20ebdaaee9c4d12a82f65ae2cded7cbc (patch)
tree9cc256f0d7eb06586009e0e16d99d0ba0e7a52d8
parent562bffe60ed85ba89920fb3918229c544eec15e9 (diff)
downloadphp-git-33e71d5c20ebdaaee9c4d12a82f65ae2cded7cbc.tar.gz
Fixed bug #69802 (Reflection on Closure::__invoke borks type hint class name)
-rw-r--r--NEWS2
-rw-r--r--Zend/tests/bug69802.phpt13
-rw-r--r--ext/reflection/php_reflection.c8
3 files changed, 21 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index e0f2a16804..5ec8877681 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,8 @@ PHP NEWS
extensions are loaded). (Laruence)
. Fixed bug #69805 (null ptr deref and seg fault in zend_resolve_class_name).
(Laruence)
+ . Fixed bug #69802 (Reflection on Closure::__invoke borks type hint class
+ name). (Dmitry)
. Fixed bug #69761 (Serialization of anonymous classes should be prevented).
(Laruence)
. Fixed bug #69551 (parse_ini_file() and parse_ini_string() segmentation
diff --git a/Zend/tests/bug69802.phpt b/Zend/tests/bug69802.phpt
new file mode 100644
index 0000000000..6143b0be66
--- /dev/null
+++ b/Zend/tests/bug69802.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #69802 (Reflection on Closure::__invoke borks type hint class name)
+--FILE--
+<?php
+$f = function(stdClass $x) {};
+$r = new ReflectionMethod($f, '__invoke');
+var_dump($r->getParameters()[0]->getClass());
+?>
+--EXPECT--
+object(ReflectionClass)#4 (1) {
+ ["name"]=>
+ string(8) "stdClass"
+}
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 4c570d7573..c8c5a527ab 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -2620,7 +2620,10 @@ ZEND_METHOD(reflection_parameter, getClass)
const char *class_name;
size_t class_name_len;
- if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
+ if (param->fptr->type == ZEND_INTERNAL_FUNCTION &&
+ /* Closure::__invoke() reuses arg_info of user function and
+ * don't set ZEND_ACC_HAS_TYPE_HINTS flag */
+ (param->fptr->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
class_name = ((zend_internal_arg_info*)param->arg_info)->class_name;
class_name_len = strlen(class_name);
} else {
@@ -2648,7 +2651,8 @@ ZEND_METHOD(reflection_parameter, getClass)
}
ce = ce->parent;
} else {
- if (param->fptr->type == ZEND_INTERNAL_FUNCTION) {
+ if (param->fptr->type == ZEND_INTERNAL_FUNCTION &&
+ (param->fptr->common.fn_flags & ZEND_ACC_HAS_TYPE_HINTS)) {
zend_string *name = zend_string_init(class_name, class_name_len, 0);
ce = zend_lookup_class(name);
zend_string_release(name);