]> granicus.if.org Git - php/commitdiff
fix #40784 (Case sensivity in constructor's fallback)
authorAntony Dovgal <tony2001@php.net>
Mon, 12 Mar 2007 13:07:39 +0000 (13:07 +0000)
committerAntony Dovgal <tony2001@php.net>
Mon, 12 Mar 2007 13:07:39 +0000 (13:07 +0000)
Zend/tests/bug40784.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/bug40784.phpt b/Zend/tests/bug40784.phpt
new file mode 100644 (file)
index 0000000..6da8f2a
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+Bug #40784 (Case sensivity in constructor's fallback)
+--FILE--
+<?php
+
+class A {
+         function A () { echo "I'm A\n"; }
+}
+
+class B extends A {
+  function __construct() {
+    parent::__construct();
+    parent::__constrUct();
+  }
+}
+
+$b = new B;
+
+echo "Done\n";
+?>
+--EXPECTF--    
+I'm A
+I'm A
+Done
index 5f9f9be2c1dc87cb4fcfc48a3278cbd0ab889671..7f25c323eb98b22bb539ae0f00d0ac9c54dc843f 100644 (file)
@@ -1586,21 +1586,28 @@ void zend_do_begin_class_member_function_call(znode *class_name, znode *method_n
        opline->op2 = *method_name;
 
        if (opline->op2.op_type == IS_CONST) {
+               zstr lcname;
+               unsigned int lcname_len;
+
+               if (Z_TYPE(opline->op2.u.constant) == IS_UNICODE) {
+                       lcname = zend_u_str_case_fold(Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant), 0, &lcname_len);
+               } else {
+                       lcname.s = zend_str_tolower_dup(Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant));
+               }
+
                if ((sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1) == Z_UNILEN(opline->op2.u.constant) &&
-                   ZEND_U_EQUAL(Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant), ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1)) {
+                               ZEND_U_EQUAL(Z_TYPE(opline->op2.u.constant), lcname, Z_UNILEN(opline->op2.u.constant), ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1)) {
                        zval_dtor(&opline->op2.u.constant);
                        SET_UNUSED(opline->op2);
+                       efree(lcname.v);
                } else {
                        if (Z_TYPE(opline->op2.u.constant) == IS_UNICODE) {
-                               unsigned int lcname_len;
-                               zstr lcname;
-
-                               lcname = zend_u_str_case_fold(Z_TYPE(opline->op2.u.constant), Z_UNIVAL(opline->op2.u.constant), Z_UNILEN(opline->op2.u.constant), 0, &lcname_len);
                                efree(Z_USTRVAL(opline->op2.u.constant));
                                Z_USTRVAL(opline->op2.u.constant) = lcname.u;
                                Z_USTRLEN(opline->op2.u.constant) = lcname_len;
                        } else {
-                               zend_str_tolower(Z_STRVAL(opline->op2.u.constant), Z_STRLEN(opline->op2.u.constant));
+                               efree(Z_STRVAL(opline->op2.u.constant));
+                               Z_STRVAL(opline->op2.u.constant) = lcname.s;
                        }
                }
        }