From 82f1bf1b6bc3a43aba62214870e6d0931e93a6d9 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Mon, 31 Jan 2022 15:43:24 +0100 Subject: [PATCH] Fix #81708: UAF due to php_filter_float() failing for ints We must only release the zval, if we actually assign a new zval. --- ext/filter/logical_filters.c | 2 +- ext/filter/tests/bug81708.phpt | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 ext/filter/tests/bug81708.phpt diff --git a/ext/filter/logical_filters.c b/ext/filter/logical_filters.c index 1bf7c00d13c6..95f7a99e34b1 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -436,10 +436,10 @@ void php_filter_float(PHP_INPUT_FILTER_PARAM_DECL) /* {{{ */ switch (is_numeric_string(num, p - num, &lval, &dval, 0)) { case IS_LONG: - zval_ptr_dtor(value); if ((min_range_set && (lval < min_range)) || (max_range_set && (lval > max_range))) { goto error; } + zval_ptr_dtor(value); ZVAL_DOUBLE(value, (double)lval); break; case IS_DOUBLE: diff --git a/ext/filter/tests/bug81708.phpt b/ext/filter/tests/bug81708.phpt new file mode 100644 index 000000000000..d0036af13682 --- /dev/null +++ b/ext/filter/tests/bug81708.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #81708 (UAF due to php_filter_float() failing for ints) +--SKIPIF-- + +--INI-- +opcache.enable_cli=0 +--FILE-- + ['min_range' => -1, 'max_range' => 1]] +); +var_dump($input); +?> +--EXPECT-- +string(3) "+11"