diff options
| author | Antony Dovgal <tony2001@php.net> | 2006-09-19 09:04:16 +0000 |
|---|---|---|
| committer | Antony Dovgal <tony2001@php.net> | 2006-09-19 09:04:16 +0000 |
| commit | dba1f1d42fbb8ded47935928df8908084a05c855 (patch) | |
| tree | 563473672b951dff204dda1519ccd93003755014 /ext/standard/array.c | |
| parent | fe6effeeb4d155391831e27f7332630a135c3004 (diff) | |
| download | php-git-dba1f1d42fbb8ded47935928df8908084a05c855.tar.gz | |
MFH: fix #34066 (recursive array_walk causes segfault)
add tests
Diffstat (limited to 'ext/standard/array.c')
| -rw-r--r-- | ext/standard/array.c | 48 |
1 files changed, 20 insertions, 28 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c index ab48d54923..b7bf6b4549 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1131,32 +1131,28 @@ static int php_array_walk(HashTable *target_hash, zval **userdata, int recursive Apply a user function to every member of an array */ PHP_FUNCTION(array_walk) { - int argc; - zval **array, - **userdata = NULL, + zval *array, + *userdata = NULL, + *tmp, **old_walk_func_name; HashTable *target_hash; - argc = ZEND_NUM_ARGS(); old_walk_func_name = BG(array_walk_func_name); - if (argc < 2 || argc > 3 || - zend_get_parameters_ex(argc, &array, &BG(array_walk_func_name), &userdata) == FAILURE) { - BG(array_walk_func_name) = old_walk_func_name; - WRONG_PARAM_COUNT; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "az|z", &array, &tmp, &userdata) == FAILURE) { + return; } - target_hash = HASH_OF(*array); + target_hash = HASH_OF(array); if (!target_hash) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The argument should be an array"); - BG(array_walk_func_name) = old_walk_func_name; RETURN_FALSE; } - if (Z_TYPE_PP(BG(array_walk_func_name)) != IS_ARRAY && - Z_TYPE_PP(BG(array_walk_func_name)) != IS_STRING) { + if (Z_TYPE_P(tmp) != IS_ARRAY && Z_TYPE_P(tmp) != IS_STRING) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong syntax for function name"); - BG(array_walk_func_name) = old_walk_func_name; RETURN_FALSE; + } else { + BG(array_walk_func_name) = &tmp; } - php_array_walk(target_hash, userdata, 0 TSRMLS_CC); + php_array_walk(target_hash, userdata ? &userdata: NULL, 0 TSRMLS_CC); BG(array_walk_func_name) = old_walk_func_name; RETURN_TRUE; } @@ -1166,32 +1162,28 @@ PHP_FUNCTION(array_walk) Apply a user function recursively to every member of an array */ PHP_FUNCTION(array_walk_recursive) { - int argc; - zval **array, - **userdata = NULL, + zval *array, + *userdata = NULL, + *tmp, **old_walk_func_name; HashTable *target_hash; - argc = ZEND_NUM_ARGS(); old_walk_func_name = BG(array_walk_func_name); - - if (argc < 2 || argc > 3 || - zend_get_parameters_ex(argc, &array, &BG(array_walk_func_name), &userdata) == FAILURE) { - BG(array_walk_func_name) = old_walk_func_name; - WRONG_PARAM_COUNT; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "az|z", &array, &tmp, &userdata) == FAILURE) { + return; } - target_hash = HASH_OF(*array); + target_hash = HASH_OF(array); if (!target_hash) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "The argument should be an array"); - BG(array_walk_func_name) = old_walk_func_name; RETURN_FALSE; } - if (Z_TYPE_PP(BG(array_walk_func_name)) != IS_ARRAY && Z_TYPE_PP(BG(array_walk_func_name)) != IS_STRING) { + if (Z_TYPE_P(tmp) != IS_ARRAY && Z_TYPE_P(tmp) != IS_STRING) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Wrong syntax for function name"); - BG(array_walk_func_name) = old_walk_func_name; RETURN_FALSE; + } else { + BG(array_walk_func_name) = &tmp; } - php_array_walk(target_hash, userdata, 1 TSRMLS_CC); + php_array_walk(target_hash, userdata ? &userdata : NULL, 1 TSRMLS_CC); BG(array_walk_func_name) = old_walk_func_name; RETURN_TRUE; } |
