summaryrefslogtreecommitdiff
path: root/ext/filter
diff options
context:
space:
mode:
authorcdoco <gao_zihang@hotmail.com>2018-07-06 22:13:46 +0800
committerNikita Popov <nikita.ppv@gmail.com>2018-07-07 12:07:43 +0200
commit47fb17b108b401d8dbb5f1b94ec99ea0d020288a (patch)
tree5784e3710215d8f9bb72be1857b018bd51b1b578 /ext/filter
parentea2484762036e461cde5e64be803834f3b28fb16 (diff)
downloadphp-git-47fb17b108b401d8dbb5f1b94ec99ea0d020288a.tar.gz
Fixed bug #76366 (references in sub-array for filtering breaks the filter)
Diffstat (limited to 'ext/filter')
-rw-r--r--ext/filter/filter.c3
-rw-r--r--ext/filter/tests/bug76366.phpt40
2 files changed, 43 insertions, 0 deletions
diff --git a/ext/filter/filter.c b/ext/filter/filter.c
index a4ca1e0a99..5a34caaa24 100644
--- a/ext/filter/filter.c
+++ b/ext/filter/filter.c
@@ -621,6 +621,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)
+ }
+}