From 43c8316d2d634e31264186569c8c7f9045fc25e3 Mon Sep 17 00:00:00 2001 From: Antony Dovgal Date: Mon, 12 Mar 2007 13:07:39 +0000 Subject: [PATCH] fix #40784 (Case sensivity in constructor's fallback) --- Zend/tests/bug40784.phpt | 24 ++++++++++++++++++++++++ Zend/zend_compile.c | 19 +++++++++++++------ 2 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 Zend/tests/bug40784.phpt diff --git a/Zend/tests/bug40784.phpt b/Zend/tests/bug40784.phpt new file mode 100644 index 0000000000..6da8f2a16b --- /dev/null +++ b/Zend/tests/bug40784.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #40784 (Case sensivity in constructor's fallback) +--FILE-- + +--EXPECTF-- +I'm A +I'm A +Done diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 5f9f9be2c1..7f25c323eb 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -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; } } } -- 2.40.0