diff options
author | Andrei Zmievski <andrei@php.net> | 2001-03-09 21:42:26 +0000 |
---|---|---|
committer | Andrei Zmievski <andrei@php.net> | 2001-03-09 21:42:26 +0000 |
commit | 8d677828b9e1502addd2c02d76b5f87c495ec531 (patch) | |
tree | 98fc106fba1a6719ed65e8c16a806bd909d29c1b | |
parent | 068fd3b24f0aa5fbbe662271995e995fe4da7561 (diff) | |
download | php-git-8d677828b9e1502addd2c02d76b5f87c495ec531.tar.gz |
@- Fixed argument checking for call_user_func* functions and allowed
@ specifying array($obj, 'method') syntax for call_user_func_array. (Andrei)
-rw-r--r-- | ext/standard/basic_functions.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 727a68c0d8..a3fa6bd51f 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -1597,12 +1597,17 @@ PHP_FUNCTION(call_user_func) efree(params); RETURN_FALSE; } - SEPARATE_ZVAL(params[0]); + + if (Z_TYPE_PP(params[0]) != IS_STRING && Z_TYPE_PP(params[0]) != IS_ARRAY) { + SEPARATE_ZVAL(params[0]); + convert_to_string_ex(params[0]); + } + if (call_user_function_ex(CG(function_table), NULL, *params[0], &retval_ptr, arg_count-1, params+1, 1, NULL)==SUCCESS && retval_ptr) { COPY_PZVAL_TO_ZVAL(*return_value, retval_ptr); } else { - php_error(E_WARNING,"Unable to call %s() - function does not exist", Z_STRVAL_PP(params[0])); + php_error(E_WARNING,"Unable to call %s() - function does not exist", Z_TYPE_PP(params[0]) == IS_STRING ? Z_STRVAL_PP(params[0]) : ""); } efree(params); } @@ -1625,9 +1630,14 @@ PHP_FUNCTION(call_user_func_array) zend_get_parameters_ex(2, &func_name, ¶ms) == FAILURE) { WRONG_PARAM_COUNT; } - convert_to_string_ex(func_name); + SEPARATE_ZVAL(params); convert_to_array_ex(params); + if (Z_TYPE_PP(func_name) != IS_STRING && Z_TYPE_PP(func_name) != IS_ARRAY) { + SEPARATE_ZVAL(func_name); + convert_to_string_ex(func_name); + } + params_ar = HASH_OF(*params); num_elems = zend_hash_num_elements(params_ar); @@ -1643,7 +1653,7 @@ PHP_FUNCTION(call_user_func_array) && retval_ptr) { COPY_PZVAL_TO_ZVAL(*return_value, retval_ptr); } else { - php_error(E_WARNING, "Unable to call %s() - function does not exist", Z_STRVAL_PP(func_name)); + php_error(E_WARNING, "Unable to call %s() - function does not exist", Z_TYPE_PP(func_name) == IS_STRING ? Z_STRVAL_PP(func_name) : ""); } efree(func_args); |