]> granicus.if.org Git - php/commitdiff
Fix __invoke comparison in closure_get_method
authorNikita Popov <nikic@php.net>
Wed, 30 Mar 2016 16:31:10 +0000 (18:31 +0200)
committerNikita Popov <nikic@php.net>
Wed, 30 Mar 2016 16:32:00 +0000 (18:32 +0200)
It compared against the wrong variable. Fixed this by getting rid
of lc_name entirely and use equals_literal_ci instead.

Zend/tests/closure_invoke_case_insensitive.phpt [new file with mode: 0644]
Zend/zend_closures.c

diff --git a/Zend/tests/closure_invoke_case_insensitive.phpt b/Zend/tests/closure_invoke_case_insensitive.phpt
new file mode 100644 (file)
index 0000000..d41d58a
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+Closure::__invoke() is case insensitive
+--FILE--
+<?php
+
+$inc = function(&$n) {
+    $n++;
+};
+
+$n = 1;
+$inc->__INVOKE($n);
+var_dump($n);
+
+?>
+--EXPECT--
+int(2)
index 9b4fb1180e8c81185b4f933e731fb6b479b62087..def114c4ec5e18b192dea3419ed112863a36f856 100644 (file)
@@ -297,14 +297,10 @@ ZEND_API zval* zend_get_closure_this_ptr(zval *obj) /* {{{ */
 
 static zend_function *zend_closure_get_method(zend_object **object, zend_string *method, const zval *key) /* {{{ */
 {
-       zend_string *lc_name;
-
-       lc_name = zend_string_tolower(method);
-       if (zend_string_equals_literal(method, ZEND_INVOKE_FUNC_NAME)) {
-               zend_string_release(lc_name);
+       if (zend_string_equals_literal_ci(method, ZEND_INVOKE_FUNC_NAME)) {
                return zend_get_closure_invoke_method(*object);
        }
-       zend_string_release(lc_name);
+
        return std_object_handlers.get_method(object, method, key);
 }
 /* }}} */