Skip to content

Commit 524ae41

Browse files
committed
Merge branch 'PHP-8.5'
* PHP-8.5: ext/filter: fix use-after-free in parse_str() with filter.default
2 parents 9674d84 + 27e3f6b commit 524ae41

2 files changed

Lines changed: 25 additions & 3 deletions

File tree

ext/filter/filter.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -378,15 +378,18 @@ static unsigned int php_sapi_filter(int arg, const char *var, char **val, size_t
378378
}
379379

380380
if (retval) {
381+
zend_string *tmp_str;
382+
zend_string *str = zval_get_tmp_string(&new_var, &tmp_str);
381383
if (new_val_len) {
382-
*new_val_len = Z_STRLEN(new_var);
384+
*new_val_len = ZSTR_LEN(str);
383385
}
384386
efree(*val);
385-
if (Z_STRLEN(new_var)) {
386-
*val = estrndup(Z_STRVAL(new_var), Z_STRLEN(new_var));
387+
if (ZSTR_LEN(str)) {
388+
*val = estrndup(ZSTR_VAL(str), ZSTR_LEN(str));
387389
} else {
388390
*val = estrdup("");
389391
}
392+
zend_tmp_string_release(tmp_str);
390393
zval_ptr_dtor(&new_var);
391394
}
392395

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
filter.default with parse_str must not crash on non-string filter results
3+
--EXTENSIONS--
4+
filter
5+
--INI--
6+
filter.default=int
7+
--FILE--
8+
<?php
9+
parse_str('a=1&b=notint', $out);
10+
var_dump($out);
11+
?>
12+
--EXPECTF--
13+
Deprecated: The filter.default ini setting is deprecated in %s on line %d
14+
array(2) {
15+
["a"]=>
16+
string(1) "1"
17+
["b"]=>
18+
string(0) ""
19+
}

0 commit comments

Comments
 (0)