From dce5e561a63fc970de722636ad8c09e9b079e8ae 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 fa6ae65ac58..e5e87c01568 100644 --- a/ext/filter/logical_filters.c +++ b/ext/filter/logical_filters.c @@ -435,10 +435,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 00000000000..d0036af1368 --- /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"