|  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #76859 stream_get_line skips data if used with data-generating filter
Submitted: 2018-09-11 04:48 UTC Modified: -
From: tenzzor at gmail dot com Assigned:
Status: Closed Package: Streams related
PHP Version: master-Git-2018-09-11 (Git) OS: Linux
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Bug Type:
From: tenzzor at gmail dot com
New email:
PHP Version: OS:


 [2018-09-11 04:48 UTC] tenzzor at gmail dot com
This is happening with stream filters which create more data then they consume. For example, base64_encode, zlib.inflate.

The issue is happening because stream_get_line internally calls php_stream_get_record function, which repeatedly calls php_stream_fill_read_buffer until enough data is "accumulated" in the buffer. Problem with that is repeated calls to populate read buffer force reset state of stream->readpos and stream->writepos in case filters exist on the stream.
In other words, if on second call to get_record function, buffer holds some data, but does not have delimiter in it and length of data is less then required, then function attempts to put more data into buffer, which is in effect, resets buffer and content is lost.

Test script:

$h = fopen('php://temp', 'r+b');
$len = floor(1.5 * 8 * 1024); // 8*1024 == stream->chunk_size. We need a bit more.
$data = str_repeat('1', $len);
fwrite($h, $data);
stream_filter_append($h, 'convert.base64-encode');

$out = '';
while (!feof($h)) {
    $out .= stream_get_line($h, 1024);

echo $len, ' and ', strlen(base64_decode($out)), PHP_EOL;
assert($data == base64_decode($out));

Expected result:
12288 and 12288

Actual result:
12288 and 11520

Warning: assert(): assert($data == base64_decode($out)) failed in /usr/src/app/t3.php on line 17


Add a Patch

Pull Requests

Add a Pull Request


AllCommentsChangesGit/SVN commitsRelated reports
 [2019-10-03 04:52 UTC]
Automatic comment on behalf of
Log: Fix #76859 stream_get_line skips data if used with data-generating filter
 [2019-10-03 04:52 UTC]
-Status: Open +Status: Closed
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sun Feb 25 10:01:26 2024 UTC