Bug #81092 [Opn]: Calling fflush before stream_filter_remove results in corrupted stream
| From: | mark at klb dot jp | Date: | Mon, 31 May 2021 23:17:35 +0000 |
| Subject: | Bug #81092 [Opn]: Calling fflush before stream_filter_remove results in corrupted stream | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-234135@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=81092&edit=1
ID: 81092
User updated by: mark at klb dot jp
Reported by: mark at klb dot jp
Summary: Calling fflush before stream_filter_remove results
in corrupted stream
Status: Open
Type: Bug
Package: Bzip2 Related
Operating System: Linux
PHP Version: 8.0.6
Block user comment: N
Private report: N
New Comment:
A couple notes:
I am not sure this is a bz2 issue, this could come from filters too. Outputting to php://output
using a filter and fflush()ing before removing the filter are conditions for this bug to happen.
The bz2 stream generated is cut partially, using bzcat will for example output:
php bug.php output | bzcat -tvv
(stdin):
[1: huff+mtf file ends unexpectedly
Previous Comments:
------------------------------------------------------------------------
[2021-05-31 18:34:32] mark at klb dot jp
Description:
------------
When using filters to output bzip2 compressed data, one may be tempted to call fflush() before
stream_filter_remove() to ensure all data has been written.
This used to work fine, however since php8, this causes the generated stream to be corrupt.
Test script:
---------------
<?php
if ($_SERVER['argv'][1]??'' == 'output') {
$stream = fopen('php://output', 'wb+');
$filter = stream_filter_append($stream, 'bzip2.compress', STREAM_FILTER_WRITE,
['blocks' => 9, 'work' => 0]);
fwrite($stream, random_bytes(8192));
fflush($stream);
stream_filter_remove($filter); // should call dtor
exit;
}
$script = $_SERVER['argv'][0];
$res = shell_exec('php '.escapeshellarg($script).' output'); // should output bz
encoded data
$data = bzdecompress($res);
var_dump(strlen($data));
Expected result:
----------------
int(8192)
Actual result:
--------------
int(0)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=81092&edit=1