From: Felipe Pena Date: Tue, 3 Jun 2008 19:01:26 +0000 (+0000) Subject: - MFB: Fixed bug #45089 (__callStatic $name case sensitivity) X-Git-Tag: BEFORE_HEAD_NS_CHANGE~1599 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=737dd4ef6e6b2fec6a927c04cf39c532fa44e581;p=php - MFB: Fixed bug #45089 (__callStatic $name case sensitivity) --- diff --git a/Zend/tests/call_static.phpt b/Zend/tests/call_static.phpt index e77a158914..c37bc72230 100755 --- a/Zend/tests/call_static.phpt +++ b/Zend/tests/call_static.phpt @@ -15,6 +15,6 @@ call_user_func(array("Test", "Three"), NULL, 0, false); Test::Four(5, 6, 7, 8); --EXPECT-- -two() called with 2 arguments -three() called with 3 arguments -four() called with 4 arguments +Two() called with 2 arguments +Three() called with 3 arguments +Four() called with 4 arguments diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index c11de553f3..173b3cc066 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1999,12 +1999,8 @@ int zend_do_begin_class_member_function_call(znode *class_name, znode *method_na ZEND_U_EQUAL(Z_TYPE(method_name->u.constant), lcname, Z_UNILEN(method_name->u.constant), ZEND_CONSTRUCTOR_FUNC_NAME, sizeof(ZEND_CONSTRUCTOR_FUNC_NAME)-1)) { zval_dtor(&method_name->u.constant); SET_UNUSED(*method_name); - efree(lcname.v); - } else { - efree(Z_USTRVAL(method_name->u.constant)); - Z_UNIVAL(method_name->u.constant) = lcname; - Z_UNILEN(method_name->u.constant) = lcname_len; } + efree(lcname.v); } if (class_name->op_type == IS_CONST && diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c index df4700acb6..00cc88743b 100644 --- a/Zend/zend_execute_API.c +++ b/Zend/zend_execute_API.c @@ -996,15 +996,11 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS efree(function_name_lc.v); } } else if (calling_scope) { - unsigned int lcname_len; - zstr lcname = zend_u_str_case_fold(Z_TYPE_P(fci->function_name), fname, fname_len, 1, &lcname_len); - if (calling_scope->get_static_method) { - EX(function_state).function = calling_scope->get_static_method(calling_scope, Z_TYPE_P(fci->function_name), lcname, lcname_len TSRMLS_CC); + EX(function_state).function = calling_scope->get_static_method(calling_scope, Z_TYPE_P(fci->function_name), fname, fname_len TSRMLS_CC); } else { - EX(function_state).function = zend_std_get_static_method(calling_scope, Z_TYPE_P(fci->function_name), lcname, lcname_len TSRMLS_CC); + EX(function_state).function = zend_std_get_static_method(calling_scope, Z_TYPE_P(fci->function_name), fname, fname_len TSRMLS_CC); } - efree(lcname.v); if (check_scope_or_static && EX(function_state).function && !(EX(function_state).function->common.fn_flags & ZEND_ACC_STATIC) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 9b16d39bec..4e2d7e1d44 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -906,6 +906,10 @@ ZEND_API void zend_std_callstatic_user_call(INTERNAL_FUNCTION_PARAMETERS) /* {{{ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_uchar type, zstr function_name_strval, int function_name_strlen TSRMLS_DC) /* {{{ */ { zend_function *fbc = NULL; + zstr lc_function_name; + unsigned int lc_function_name_len; + + lc_function_name = zend_u_str_case_fold(type, function_name_strval, function_name_strlen, 0, &lc_function_name_len); if (function_name_strlen == ce->name_length && ce->constructor) { zstr lc_class_name; @@ -920,7 +924,9 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_uc efree(lc_class_name.v); } - if (!fbc && zend_u_hash_find(&ce->function_table, type, function_name_strval, function_name_strlen + 1, (void **) &fbc)==FAILURE) { + if (!fbc && zend_u_hash_find(&ce->function_table, type, lc_function_name, function_name_strlen + 1, (void **) &fbc)==FAILURE) { + efree(lc_function_name.v); + if (ce->__call && EG(This) && Z_OBJ_HT_P(EG(This))->get_class_entry && @@ -972,6 +978,7 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_uc zend_error(E_ERROR, "Call to undefined method %R::%R()", type, class_name, type, function_name_strval); } } + efree(lc_function_name.v); #if MBO_0 /* right now this function is used for non static method lookup too */ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 446a7a881e..4f82777911 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1996,7 +1996,7 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS } if(OP2_TYPE != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_free_op free_op2; zend_uchar function_name_type; @@ -2009,19 +2009,22 @@ ZEND_VM_HANDLER(113, ZEND_INIT_STATIC_METHOD_CALL, CONST|VAR, CONST|TMP|VAR|UNUS if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (OP2_TYPE != IS_CONST) { - efree(function_name_strval.v); FREE_OP2(); } } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ea2dcdbcbc..76f02ee2c2 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2523,7 +2523,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HAN } if(IS_CONST != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_uchar function_name_type; @@ -2536,19 +2536,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HAN if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (IS_CONST != IS_CONST) { - efree(function_name_strval.v); } } else { @@ -3101,7 +3104,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDL } if(IS_TMP_VAR != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_free_op free_op2; zend_uchar function_name_type; @@ -3114,19 +3117,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDL if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (IS_TMP_VAR != IS_CONST) { - efree(function_name_strval.v); zval_dtor(free_op2.var); } } else { @@ -3570,7 +3576,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL } if(IS_VAR != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_free_op free_op2; zend_uchar function_name_type; @@ -3583,19 +3589,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDL if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (IS_VAR != IS_CONST) { - efree(function_name_strval.v); if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; } } else { @@ -3795,7 +3804,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HA } if(IS_UNUSED != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_uchar function_name_type; @@ -3808,19 +3817,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HA if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (IS_UNUSED != IS_CONST) { - efree(function_name_strval.v); } } else { @@ -4232,7 +4244,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLE } if(IS_CV != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_uchar function_name_type; @@ -4245,19 +4257,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLE if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (IS_CV != IS_CONST) { - efree(function_name_strval.v); } } else { @@ -10463,7 +10478,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL } if(IS_CONST != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_uchar function_name_type; @@ -10476,19 +10491,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDL if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (IS_CONST != IS_CONST) { - efree(function_name_strval.v); } } else { @@ -12351,7 +12369,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER } if(IS_TMP_VAR != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_free_op free_op2; zend_uchar function_name_type; @@ -12364,19 +12382,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (IS_TMP_VAR != IS_CONST) { - efree(function_name_strval.v); zval_dtor(free_op2.var); } } else { @@ -14209,7 +14230,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER } if(IS_VAR != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_free_op free_op2; zend_uchar function_name_type; @@ -14222,19 +14243,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (IS_VAR != IS_CONST) { - efree(function_name_strval.v); if (free_op2.var) {zval_ptr_dtor(&free_op2.var);}; } } else { @@ -15165,7 +15189,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAND } if(IS_UNUSED != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_uchar function_name_type; @@ -15178,19 +15202,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HAND if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (IS_UNUSED != IS_CONST) { - efree(function_name_strval.v); } } else { @@ -16673,7 +16700,7 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ } if(IS_CV != IS_UNUSED) { zstr function_name_strval; - unsigned int function_name_strlen; + unsigned int function_name_strlen = 0; zend_uchar function_name_type; @@ -16686,19 +16713,22 @@ static int ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ if (Z_TYPE_P(function_name) != IS_STRING && Z_TYPE_P(function_name) != IS_UNICODE) { zend_error_noreturn(E_ERROR, "Function name must be a string"); + } else { + function_name_strval = Z_UNIVAL_P(function_name); + function_name_strlen = Z_UNILEN_P(function_name); + function_name_type = Z_TYPE_P(function_name); } - function_name_strval = zend_u_str_case_fold(Z_TYPE_P(function_name), Z_UNIVAL_P(function_name), Z_UNILEN_P(function_name), 1, &function_name_strlen); - function_name_type = Z_TYPE_P(function_name); } - if (ce->get_static_method) { - EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); - } else { - EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + if (function_name_strlen) { + if (ce->get_static_method) { + EX(fbc) = ce->get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } else { + EX(fbc) = zend_std_get_static_method(ce, function_name_type, function_name_strval, function_name_strlen TSRMLS_CC); + } } if (IS_CV != IS_CONST) { - efree(function_name_strval.v); } } else {