Skip to content

Commit c56f0f1

Browse files
committed
Merge branch 'PHP-8.6'
* PHP-8.6: Fix use-after-free when removing a failing zlib.inflate filter (#24176)
2 parents 473660b + 70e083c commit c56f0f1

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
--TEST--
2+
zlib.inflate filter removed by the error handler of its own notice
3+
--EXTENSIONS--
4+
zlib
5+
--FILE--
6+
<?php
7+
$fp = fopen('php://memory', 'w+');
8+
$filter = stream_filter_append($fp, 'zlib.inflate', STREAM_FILTER_WRITE);
9+
set_error_handler(function (int $errno, string $errstr) use (&$filter) {
10+
echo $errstr, "\n";
11+
var_dump(stream_filter_remove($filter));
12+
return true;
13+
});
14+
var_dump(fwrite($fp, "\xff\xff\xff\xff"));
15+
16+
$fp = fopen('php://memory', 'w+');
17+
fwrite($fp, "\xff\xff\xff\xff");
18+
rewind($fp);
19+
$filter = stream_filter_append($fp, 'zlib.inflate', STREAM_FILTER_READ);
20+
var_dump(fread($fp, 10));
21+
echo "Done\n";
22+
?>
23+
--EXPECT--
24+
fwrite(): zlib: data error
25+
bool(true)
26+
bool(false)
27+
fread(): zlib: data error
28+
bool(true)
29+
bool(false)
30+
Done

‎ext/zlib/zlib_filter.c‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,12 @@ static php_stream_filter_status_t php_zlib_inflate_filter(
8989
exit_status = PSFS_PASS_ON;
9090
} else if (status != Z_OK && status != Z_BUF_ERROR) {
9191
/* Something bad happened */
92-
php_error_docref(NULL, E_NOTICE, "zlib: %s", zError(status));
9392
php_stream_bucket_delref(bucket);
9493
/* reset these because despite the error the filter may be used again */
9594
data->strm.next_in = data->inbuf;
9695
data->strm.avail_in = 0;
96+
/* Last: an error handler may remove this filter and free data. */
97+
php_error_docref(NULL, E_NOTICE, "zlib: %s", zError(status));
9798
return PSFS_ERR_FATAL;
9899
}
99100
desired -= data->strm.avail_in; /* desired becomes what we consumed this round through */

0 commit comments

Comments
 (0)