From: Antony Dovgal Date: Thu, 31 Aug 2006 22:11:35 +0000 (+0000) Subject: change filters to operate on the copy of data, so multiple filters an be applied... X-Git-Tag: RELEASE_1_0_0RC1~1800 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=835814617f0787b28b0db8137ed7cf2dbc8d3798;p=php change filters to operate on the copy of data, so multiple filters an be applied one after another --- diff --git a/ext/filter/filter.c b/ext/filter/filter.c index 5d791b3f4c..8e48602e28 100644 --- a/ext/filter/filter.c +++ b/ext/filter/filter.c @@ -301,7 +301,7 @@ static filter_list_entry php_find_filter(long id) /* {{{ */ } /* }}} */ -static void php_zval_filter(zval *value, long filter, long flags, zval *options, char* charset TSRMLS_DC) /* {{{ */ +static void php_zval_filter(zval **value, long filter, long flags, zval *options, char* charset TSRMLS_DC) /* {{{ */ { filter_list_entry filter_func; @@ -312,10 +312,11 @@ static void php_zval_filter(zval *value, long filter, long flags, zval *options, filter_func = php_find_filter(FILTER_DEFAULT); } + SEPARATE_ZVAL(value); /* Here be strings */ - convert_to_string(value); + convert_to_string(*value); - filter_func.function(value, flags, options, charset TSRMLS_CC); + filter_func.function(*value, flags, options, charset TSRMLS_CC); } /* }}} */ @@ -376,8 +377,10 @@ static unsigned int php_sapi_filter(int arg, char *var, char **val, unsigned int Z_TYPE(new_var) = IS_STRING; if (!(IF_G(default_filter) == FILTER_UNSAFE_RAW)) { + zval *tmp_new_var = &new_var; Z_STRVAL(new_var) = estrndup(*val, val_len); - php_zval_filter(&new_var, IF_G(default_filter), IF_G(default_filter_flags), NULL, NULL/*charset*/ TSRMLS_CC); + INIT_PZVAL(tmp_new_var); + php_zval_filter(&tmp_new_var, IF_G(default_filter), IF_G(default_filter_flags), NULL, NULL/*charset*/ TSRMLS_CC); } #if PHP_VERSION_ID<60000 else if (PG(magic_quotes_gpc)) { @@ -415,16 +418,16 @@ static unsigned int php_sapi_filter(int arg, char *var, char **val, unsigned int } /* }}} */ -static void php_zval_filter_recursive(zval *value, long filter, long flags, zval *options, char *charset TSRMLS_DC) /* {{{ */ +static void php_zval_filter_recursive(zval **value, long filter, long flags, zval *options, char *charset TSRMLS_DC) /* {{{ */ { zval **element; HashPosition pos; - if (Z_TYPE_P(value) == IS_ARRAY) { - for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(value), &pos); - zend_hash_get_current_data_ex(Z_ARRVAL_P(value), (void **) &element, &pos) == SUCCESS; - zend_hash_move_forward_ex(Z_ARRVAL_P(value), &pos)) { - php_zval_filter_recursive(*element, filter, flags, options, charset TSRMLS_CC); + if (Z_TYPE_PP(value) == IS_ARRAY) { + for (zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(value), &pos); + zend_hash_get_current_data_ex(Z_ARRVAL_PP(value), (void **) &element, &pos) == SUCCESS; + zend_hash_move_forward_ex(Z_ARRVAL_PP(value), &pos)) { + php_zval_filter_recursive(element, filter, flags, options, charset TSRMLS_CC); } } else { php_zval_filter(value, filter, flags, options, charset TSRMLS_CC); @@ -632,7 +635,7 @@ PHP_FUNCTION(input_get) if (found) { zval_copy_ctor(return_value); /* Watch out for empty strings */ - php_zval_filter_recursive(return_value, filter, filter_flags, options, charset TSRMLS_CC); + php_zval_filter_recursive(&return_value, filter, filter_flags, options, charset TSRMLS_CC); } else { RETURN_NULL(); } @@ -779,7 +782,7 @@ PHP_FUNCTION(input_get_args) } if (filter_flags & FILTER_FLAG_ARRAY) { - php_zval_filter_recursive(*tmp, filter, filter_flags, options, charset TSRMLS_CC); + php_zval_filter_recursive(tmp, filter, filter_flags, options, charset TSRMLS_CC); /* ARRAY always returns an array */ if (Z_TYPE_PP(tmp) != IS_ARRAY) { @@ -789,7 +792,7 @@ PHP_FUNCTION(input_get_args) *tmp = temparray; } } else { - php_zval_filter(*tmp, filter, filter_flags, options, charset TSRMLS_CC); + php_zval_filter(tmp, filter, filter_flags, options, charset TSRMLS_CC); } zval_add_ref(tmp); add_assoc_zval(return_value, key, *tmp); @@ -883,7 +886,7 @@ PHP_FUNCTION(filter_data) } } } - php_zval_filter_recursive(var, filter, filter_flags, options, charset TSRMLS_CC); + php_zval_filter_recursive(&var, filter, filter_flags, options, charset TSRMLS_CC); RETURN_ZVAL(var, 1, 0); } /* }}} */