diff options
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r-- | Zend/zend_builtin_functions.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index 3d9123eadb..ca054f3086 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -1696,7 +1696,7 @@ ZEND_FUNCTION(get_defined_vars) Creates an anonymous function, and returns its name (funny, eh?) */ ZEND_FUNCTION(create_function) { - char *eval_code, *function_name; + char *eval_code, function_name[sizeof("0lambda_") + MAX_LENGTH_OF_LONG]; int eval_code_length, function_name_length; zstr args, code; int args_len, code_len; @@ -1740,16 +1740,31 @@ ZEND_FUNCTION(create_function) code_len = len; } - eval_code_length = sizeof(LAMBDA_DECLARE_ENCODING "function " LAMBDA_TEMP_FUNCNAME) + eval_code = (char *) emalloc(sizeof(LAMBDA_DECLARE_ENCODING "function " LAMBDA_TEMP_FUNCNAME) +args_len +2 /* for the args parentheses */ +2 /* for the curly braces */ - +code_len; + +code_len); - eval_code = (char *) emalloc(eval_code_length); - sprintf(eval_code, "%sfunction " LAMBDA_TEMP_FUNCNAME "(%s){%s}", - (type == IS_UNICODE) ? LAMBDA_DECLARE_ENCODING : "", - args.s, code.s); + if (type == IS_UNICODE) { + eval_code_length = sizeof(LAMBDA_DECLARE_ENCODING "function " LAMBDA_TEMP_FUNCNAME "(") - 1; + memcpy(eval_code, LAMBDA_DECLARE_ENCODING "function " LAMBDA_TEMP_FUNCNAME "(", eval_code_length); + } else { + eval_code_length = sizeof("function " LAMBDA_TEMP_FUNCNAME "(") - 1; + memcpy(eval_code, "function " LAMBDA_TEMP_FUNCNAME "(", eval_code_length); + } + + memcpy(eval_code + eval_code_length, args.s, args_len); + eval_code_length += args_len; + + eval_code[eval_code_length++] = ')'; + eval_code[eval_code_length++] = '{'; + + memcpy(eval_code + eval_code_length, code.s, code_len); + eval_code_length += code_len; + + eval_code[eval_code_length++] = '}'; + eval_code[eval_code_length] = '\0'; if (type == IS_UNICODE) { efree(args.s); @@ -1757,7 +1772,7 @@ ZEND_FUNCTION(create_function) } eval_name = zend_make_compiled_string_description("runtime-created function" TSRMLS_CC); - retval = zend_eval_string(eval_code, NULL, eval_name TSRMLS_CC); + retval = zend_eval_stringl(eval_code, eval_code_length, NULL, eval_name TSRMLS_CC); efree(eval_code); efree(eval_name); @@ -1771,15 +1786,13 @@ ZEND_FUNCTION(create_function) new_function = *func; function_add_ref(&new_function TSRMLS_CC); - function_name = (char *) emalloc(sizeof("0lambda_")+MAX_LENGTH_OF_LONG); + function_name[0] = '\0'; do { - sprintf(function_name, "%clambda_%d", 0, ++EG(lambda_count)); - function_name_length = strlen(function_name+1)+1; + function_name_length = 1 + sprintf(function_name + 1, "lambda_%d", ++EG(lambda_count)); } while (zend_hash_add(EG(function_table), function_name, function_name_length+1, &new_function, sizeof(zend_function), NULL)==FAILURE); zend_hash_del(EG(function_table), LAMBDA_TEMP_FUNCNAME, sizeof(LAMBDA_TEMP_FUNCNAME)); - RETVAL_ASCII_STRINGL(function_name, function_name_length, 0); - efree(function_name); + RETURN_ASCII_STRINGL(function_name, function_name_length, 0); } else { RETURN_FALSE; } |