summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--ext/filter/filter.c3
-rw-r--r--ext/filter/tests/bug76366.phpt40
3 files changed, 47 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index ceb4780873..06f66b1300 100644
--- a/NEWS
+++ b/NEWS
@@ -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)
+ }
+}