diff options
-rw-r--r-- | Zend/zend_compile.c | 8 | ||||
-rw-r--r-- | Zend/zend_execute.c | 10 |
2 files changed, 12 insertions, 6 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 67d02903b8..ec1dc09497 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1140,12 +1140,16 @@ void zend_do_receive_arg(zend_uchar op, znode *var, znode *offset, znode *initia int zend_do_begin_function_call(znode *function_name TSRMLS_DC) { zend_function *function; + char *lcname; - zend_str_tolower(function_name->u.constant.value.str.val, function_name->u.constant.value.str.len); - if (zend_hash_find(CG(function_table), function_name->u.constant.value.str.val, function_name->u.constant.value.str.len+1, (void **) &function)==FAILURE) { + lcname = zend_str_tolower_dup(function_name->u.constant.value.str.val, function_name->u.constant.value.str.len); + if (zend_hash_find(CG(function_table), lcname, function_name->u.constant.value.str.len+1, (void **) &function)==FAILURE) { zend_do_begin_dynamic_function_call(function_name TSRMLS_CC); + efree(lcname); return 1; /* Dynamic */ } + efree(function_name->u.constant.value.str.val); + function_name->u.constant.value.str.val = lcname; switch (function->type) { case ZEND_USER_FUNCTION: { diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 6d0111f936..df8914cb20 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2454,7 +2454,7 @@ int zend_init_fcall_by_name_handler(ZEND_OPCODE_HANDLER_ARGS) zval *function_name; zend_function *function; zend_bool is_const; - char *function_name_strval; + char *function_name_strval, *lcname; int function_name_strlen; zend_ptr_stack_n_push(&EG(arg_types_stack), 3, EX(fbc), EX(object), EX(calling_scope)); @@ -2470,16 +2470,18 @@ int zend_init_fcall_by_name_handler(ZEND_OPCODE_HANDLER_ARGS) if (Z_TYPE_P(function_name) != IS_STRING) { zend_error(E_ERROR, "Function name must be a string"); } - function_name_strval = zend_str_tolower_dup(function_name->value.str.val, function_name->value.str.len); + function_name_strval = function_name->value.str.val; function_name_strlen = function_name->value.str.len; } - if (zend_hash_find(EG(function_table), function_name_strval, function_name_strlen+1, (void **) &function)==FAILURE) { + lcname = zend_str_tolower_dup(function_name_strval, function_name_strlen); + if (zend_hash_find(EG(function_table), lcname, function_name_strlen+1, (void **) &function)==FAILURE) { + efree(lcname); zend_error(E_ERROR, "Call to undefined function %s()", function_name_strval); } + efree(lcname); if (!is_const) { - efree(function_name_strval); FREE_OP(EX(Ts), &EX(opline)->op2, EG(free_op2)); } |