summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@php.net>2005-09-12 09:58:50 +0000
committerDmitry Stogov <dmitry@php.net>2005-09-12 09:58:50 +0000
commit9a74c68a4cb25fb83599eea609d8bf54f96d605a (patch)
treeb013dbf15d089549f2d4157cd2bb878fad8e5ea1 /ext/standard/array.c
parent21698c12fefc21acc7b2de2c54aa2b19cfaf3678 (diff)
downloadphp-git-9a74c68a4cb25fb83599eea609d8bf54f96d605a.tar.gz
Additinal fix for bug #34277 (array_filter() crashes with references and objects)
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index f3b50b9d79..f092af4f3e 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -4117,7 +4117,7 @@ PHP_FUNCTION(array_reduce)
PHP_FUNCTION(array_filter)
{
zval **input, **callback = NULL;
- zval *array;
+ zval *array, *func = NULL;
zval **operand;
zval **args[1];
zval *retval = NULL;
@@ -4137,10 +4137,13 @@ PHP_FUNCTION(array_filter)
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The first argument should be an array");
return;
}
+ if (callback) {
+ func = *callback;
+ }
array = *input;
if (ZEND_NUM_ARGS() > 1) {
- if (!zend_is_callable(*callback, 0, &callback_name)) {
+ if (!zend_is_callable(func, 0, &callback_name)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The second argument, '%s', should be a valid callback", callback_name);
efree(callback_name);
return;
@@ -4157,14 +4160,14 @@ PHP_FUNCTION(array_filter)
zend_hash_get_current_data_ex(Z_ARRVAL_P(array), (void **)&operand, &pos) == SUCCESS;
zend_hash_move_forward_ex(Z_ARRVAL_P(array), &pos)) {
- if (callback) {
+ if (func) {
zend_fcall_info fci;
args[0] = operand;
fci.size = sizeof(fci);
fci.function_table = EG(function_table);
- fci.function_name = *callback;
+ fci.function_name = func;
fci.symbol_table = NULL;
fci.object_pp = NULL;
fci.retval_ptr_ptr = &retval;