From: Antony Dovgal Date: Thu, 14 Sep 2006 15:30:13 +0000 (+0000) Subject: separate zval only when needed (fixes 035.phpt and doesn't affect SAPI filtering) X-Git-Tag: php-5.2.0RC4~4 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7a5306598aa3f4ae4c5cc803a035702fb23f8e3f;p=php separate zval only when needed (fixes 035.phpt and doesn't affect SAPI filtering) --- diff --git a/ext/filter/filter.c b/ext/filter/filter.c index 70aa42ec0d..b0d88763a9 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, zend_bool copy TSRMLS_DC) /* {{{ */ { filter_list_entry filter_func; @@ -312,7 +312,9 @@ static void php_zval_filter(zval **value, long filter, long flags, zval *options filter_func = php_find_filter(FILTER_DEFAULT); } - /* Comment this out until there is a better solution: SEPARATE_ZVAL(value); */ + if (copy) { + SEPARATE_ZVAL(value); + } /* Here be strings */ convert_to_string(*value); @@ -379,7 +381,7 @@ static unsigned int php_sapi_filter(int arg, char *var, char **val, unsigned int 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(&tmp_new_var, IF_G(default_filter), IF_G(default_filter_flags), NULL, NULL/*charset*/ TSRMLS_CC); + php_zval_filter(&tmp_new_var, IF_G(default_filter), IF_G(default_filter_flags), NULL, NULL/*charset*/, 0 TSRMLS_CC); } else if (PG(magic_quotes_gpc)) { Z_STRVAL(new_var) = php_addslashes(*val, Z_STRLEN(new_var), &Z_STRLEN(new_var), 0 TSRMLS_CC); } else { @@ -413,7 +415,7 @@ 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, zend_bool copy TSRMLS_DC) /* {{{ */ { zval **element; HashPosition pos; @@ -422,10 +424,10 @@ static void php_zval_filter_recursive(zval **value, long filter, long flags, zva 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); + php_zval_filter_recursive(element, filter, flags, options, charset, copy TSRMLS_CC); } } else { - php_zval_filter(value, filter, flags, options, charset TSRMLS_CC); + php_zval_filter(value, filter, flags, options, charset, copy TSRMLS_CC); } } /* }}} */ @@ -644,7 +646,7 @@ PHP_FUNCTION(input_get) ZVAL_BOOL(return_value, 0); } - php_zval_filter_recursive(&return_value, filter, filter_flags, options, charset TSRMLS_CC); + php_zval_filter_recursive(&return_value, filter, filter_flags, options, charset, 1 TSRMLS_CC); } else { RETURN_NULL(); } @@ -673,6 +675,7 @@ PHP_FUNCTION(input_get_args) char *key; unsigned int key_len; unsigned long index; + zend_bool copy = 0; /* pointers to the zval array GET, POST,... */ zval *array_ptr = NULL; @@ -700,6 +703,7 @@ PHP_FUNCTION(input_get_args) case PARSE_DATA: array_ptr = values; + copy = 1; break; case PARSE_SESSION: @@ -791,7 +795,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, copy TSRMLS_CC); /* ARRAY always returns an array */ if (Z_TYPE_PP(tmp) != IS_ARRAY) { @@ -801,7 +805,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, copy TSRMLS_CC); } zval_add_ref(tmp); add_assoc_zval(return_value, key, *tmp); @@ -895,7 +899,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, 1 TSRMLS_CC); RETURN_ZVAL(var, 1, 0); } /* }}} */