]> granicus.if.org Git - php/commitdiff
Fix bug #75290
authorAndrea Faulds <ajf@ajf.me>
Fri, 29 Sep 2017 20:38:08 +0000 (21:38 +0100)
committerAndrea Faulds <ajf@ajf.me>
Fri, 29 Sep 2017 20:38:08 +0000 (21:38 +0100)
NEWS
Zend/tests/bug75290.phpt [new file with mode: 0644]
Zend/zend_closures.c

diff --git a/NEWS b/NEWS
index c3e57603e33e986130b9d5aa70de2471bdf1bc85..2a2881cf0efdec4a2e1d614e86f397fafa36ffc7 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,8 @@ PHP                                                                        NEWS
     request). (Nikita)
   . Fixed bug #75220 (Segfault when calling is_callable on parent). 
     (andrewnester)
+  . Fixed bug #75290 (debug info of Closures of internal functions contain
+    garbage argument names). (Andrea)
 
 - litespeed:
   . Fixed bug #75248 (Binary directory doesn't get created when building 
diff --git a/Zend/tests/bug75290.phpt b/Zend/tests/bug75290.phpt
new file mode 100644 (file)
index 0000000..416af06
--- /dev/null
@@ -0,0 +1,26 @@
+--TEST--
+Bug #75290 (debug info of Closures of internal functions contain garbage argument names)
+--FILE--
+<?php
+
+var_dump((new ReflectionFunction('sin'))->getClosure());
+
+var_dump(function ($someThing) {});
+
+?>
+--EXPECT--
+object(Closure)#2 (1) {
+  ["parameter"]=>
+  array(1) {
+    ["$number"]=>
+    string(10) "<required>"
+  }
+}
+object(Closure)#2 (1) {
+  ["parameter"]=>
+  array(1) {
+    ["$someThing"]=>
+    string(10) "<required>"
+  }
+}
+
index 0176f5b5fab6234129996a962f1eccb64391c97d..da42d03899173d3992fbbd792ad0476677e0cc83 100644 (file)
@@ -414,6 +414,7 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp) /* {{{
        zval val;
        struct _zend_arg_info *arg_info = closure->func.common.arg_info;
        HashTable *debug_info;
+       zend_bool zstr_args = (closure->func.type == ZEND_USER_FUNCTION) || (closure->func.common.fn_flags & ZEND_ACC_USER_ARG_INFO);
 
        *is_temp = 1;
 
@@ -446,9 +447,15 @@ static HashTable *zend_closure_get_debug_info(zval *object, int *is_temp) /* {{{
                        zend_string *name;
                        zval info;
                        if (arg_info->name) {
-                               name = zend_strpprintf(0, "%s$%s",
-                                               arg_info->pass_by_reference ? "&" : "",
-                                               ZSTR_VAL(arg_info->name));
+                               if (zstr_args) {
+                                       name = zend_strpprintf(0, "%s$%s",
+                                                       arg_info->pass_by_reference ? "&" : "",
+                                                       ZSTR_VAL(arg_info->name));
+                               } else {
+                                       name = zend_strpprintf(0, "%s$%s",
+                                                       arg_info->pass_by_reference ? "&" : "",
+                                                       ((zend_internal_arg_info*)arg_info)->name);
+                               }
                        } else {
                                name = zend_strpprintf(0, "%s$param%d",
                                                arg_info->pass_by_reference ? "&" : "",