diff options
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | ext/filter/filter.c | 3 | ||||
-rw-r--r-- | ext/filter/tests/bug76366.phpt | 40 |
3 files changed, 47 insertions, 0 deletions
@@ -6,6 +6,10 @@ PHP NEWS . Fixed bug #76392 (Error relocating sapi/cli/php: unsupported relocation type 37). (Peter Kokot) +- Filter: + . Fixed bug #76366 (References in sub-array for filtering breaks the filter). + (ZiHang Gao) + - FPM: . Fixed bug #62596 (getallheaders() missing with PHP-FPM). (Remi) diff --git a/ext/filter/filter.c b/ext/filter/filter.c index 56c93199f0..7e43619889 100644 --- a/ext/filter/filter.c +++ b/ext/filter/filter.c @@ -614,6 +614,9 @@ static void php_filter_call(zval *filtered, zend_long filter, zval *filter_args, } if ((option = zend_hash_str_find(HASH_OF(filter_args), "options", sizeof("options") - 1)) != NULL) { + /* avoid reference type */ + ZVAL_DEREF(option); + if (filter != FILTER_CALLBACK) { if (Z_TYPE_P(option) == IS_ARRAY) { options = option; diff --git a/ext/filter/tests/bug76366.phpt b/ext/filter/tests/bug76366.phpt new file mode 100644 index 0000000000..56cbb9db54 --- /dev/null +++ b/ext/filter/tests/bug76366.phpt @@ -0,0 +1,40 @@ +--TEST-- +Bug #76366 (references in sub-array for filtering breaks the filter) +--SKIPIF-- +<?php +if (!extension_loaded('filter')) die('skip filter extension not available'); +?> +--FILE-- +<?php + +#array to filter +$data = ['foo' => 6]; + +#filter args +$args = [ + 'foo'=> [ + 'filter' => FILTER_VALIDATE_INT, + 'flags' => FILTER_FORCE_ARRAY + ] +]; + +$args['foo']['options'] = []; + +#create reference +$options = &$args['foo']['options']; + +#set options +$options['min_range'] = 1; +$options['max_range'] = 5; + +#show the filter result +var_dump(filter_var_array($data, $args)); +?> +--EXPECT-- +array(1) { + ["foo"]=> + array(1) { + [0]=> + bool(false) + } +} |