cvs: php4 /ext/standard basic_functions.c
| From: | Sterling Hughes | Date: | Mon, 14 May 2001 20:06:08 +0000 |
| Subject: | cvs: php4 /ext/standard basic_functions.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-5742@lists.php.net to get a copy of this message | ||
sterling Mon May 14 13:06:08 2001 EDT
Modified files:
/php4/ext/standard basic_functions.c
Log:
Use zend_is_callable to test whether or not the given callback is valid
before calling the function.
Index: php4/ext/standard/basic_functions.c
diff -u php4/ext/standard/basic_functions.c:1.335 php4/ext/standard/basic_functions.c:1.336
--- php4/ext/standard/basic_functions.c:1.335 Mon May 14 12:19:03 2001
+++ php4/ext/standard/basic_functions.c Mon May 14 13:06:06 2001
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: basic_functions.c,v 1.335 2001/05/14 19:19:03 sterling Exp $ */
+/* $Id: basic_functions.c,v 1.336 2001/05/14 20:06:06 sterling Exp $ */
#include "php.h"
#include "php_main.h"
@@ -1603,29 +1603,22 @@
return SUCCESS;
}
-static void unable_to_call_user_function(zval **fcall)
-{
- char *name;
-
- zend_is_callable(*fcall, 1, &name);
- php_error(E_WARNING, "Unable to call %s()", name);
- efree(name);
-}
-
/* {{{ proto mixed call_user_func(string function_name [, mixed parmeter] [, mixed ...])
Call a user function which is the first parameter */
PHP_FUNCTION(call_user_func)
{
- zval ***params;
- zval *retval_ptr;
- int arg_count=ZEND_NUM_ARGS();
+ zval ***params;
+ zval *retval_ptr;
+ char *name;
+ zend_bool callable;
+ int argc = ZEND_NUM_ARGS();
- if (arg_count<1) {
+ if (argc < 1) {
WRONG_PARAM_COUNT;
}
- params = (zval ***) emalloc(sizeof(zval **) * arg_count);
+ params = emalloc(sizeof(zval **) * argc);
- if (zend_get_parameters_array_ex(arg_count, params)==FAILURE) {
+ if (zend_get_parameters_array_ex(argc, params)==FAILURE) {
efree(params);
RETURN_FALSE;
}
@@ -1634,13 +1627,21 @@
SEPARATE_ZVAL(params[0]);
convert_to_string_ex(params[0]);
}
+
+ callable = zend_is_callable(*params[0], 0, &name);
+ if (! callable) {
+ php_error(E_WARNING, "Argument 1 to call_user_func() must be a valid callback");
+ efree(params);
+ RETURN_NULL();
+ }
- if (call_user_function_ex(EG(function_table), NULL, *params[0], &retval_ptr, arg_count-1,
params+1, 0, NULL)==SUCCESS && retval_ptr) {
+ if (call_user_function_ex(EG(function_table), NULL, *params[0], &retval_ptr, argc - 1, params
+ 1, 0, NULL)==SUCCESS && retval_ptr) {
COPY_PZVAL_TO_ZVAL(*return_value, retval_ptr);
} else {
- unable_to_call_user_function(params[0]);
+ php_error(E_WARNING, "Unable to call function %s()", name);
}
+ efree(name);
efree(params);
}
/* }}} */
@@ -1649,44 +1650,53 @@
Call a user function which is the first parameter with the arguments contained in array */
PHP_FUNCTION(call_user_func_array)
{
- zval **func_name,
- **params,
- ***func_args = NULL,
- *retval_ptr;
- HashTable *params_ar;
- int num_elems,
- element = 0;
+ zval ***func_params;
+ zval **func;
+ zval **params;
+ zval *retval_ptr;
+ HashTable *func_params_ht;
+ char *name;
+ zend_bool callable;
+ int count;
+ int current = 0;
if (ZEND_NUM_ARGS() != 2 ||
- zend_get_parameters_ex(2, &func_name, ¶ms) == FAILURE) {
+ zend_get_parameters_ex(2, &func, ¶ms) == FAILURE) {
WRONG_PARAM_COUNT;
}
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);
+ if (Z_TYPE_PP(func) != IS_STRING && Z_TYPE_PP(func) != IS_ARRAY) {
+ SEPARATE_ZVAL(func);
+ convert_to_string_ex(func);
}
- params_ar = HASH_OF(*params);
+ callable = zend_is_callable(*func, 0, &name);
+ if (! callable) {
+ php_error(E_WARNING, "Argument 1 to call_user_func_array() must be a valid callback");
+ RETURN_NULL();
+ }
- num_elems = zend_hash_num_elements(params_ar);
+ func_params_ht = Z_ARRVAL_PP(params);
- func_args = (zval ***)emalloc(sizeof(zval **) * num_elems);
+ count = zend_hash_num_elements(func_params_ht);
+ func_params = emalloc(sizeof(zval **) * count);
- for (zend_hash_internal_pointer_reset(params_ar);
- zend_hash_get_current_data(params_ar, (void **)&(func_args[element])) == SUCCESS;
- zend_hash_move_forward(params_ar))
- element++;
+ for (zend_hash_internal_pointer_reset(func_params_ht);
+ zend_hash_get_current_data(func_params_ht, (void **) &func_params[current]) == SUCCESS;
+ zend_hash_move_forward(func_params_ht)) {
+ current++;
+ }
- if (call_user_function_ex(EG(function_table), NULL, *func_name, &retval_ptr, num_elems,
func_args, 0, NULL) == SUCCESS && retval_ptr) {
+ if (call_user_function_ex(EG(function_table), NULL, *func, &retval_ptr, count, func_params, 0,
NULL) == SUCCESS && retval_ptr) {
COPY_PZVAL_TO_ZVAL(*return_value, retval_ptr);
} else {
- unable_to_call_user_function(func_name);
+ php_error(E_WARNING, "Unable to call %s()", name);
}
- efree(func_args);
+ efree(name);
+ efree(func_params);
}
/* }}} */