summaryrefslogtreecommitdiff
path: root/Zend/zend_builtin_functions.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_builtin_functions.c')
-rw-r--r--Zend/zend_builtin_functions.c39
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;
}