php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #81302 Stream position after stream filter removed
Submitted: 2021-07-27 09:46 UTC Modified: 2021-08-10 10:01 UTC
From: ivo dot andonov at gmail dot com Assigned: cmb (profile)
Status: Closed Package: Streams related
PHP Version: 8.0.8 OS: Linux / Windows
Private report: No CVE-ID: None
 [2021-07-27 09:46 UTC] ivo dot andonov at gmail dot com
Description:
------------
This one is somewhat following https://bugs.php.net/bug.php?id=81294 and is again related to the removal of a filter. If the filter being removed outputs additional data then this data is correctly written to the underlying stream however the stream position is not updated.

Seems that this should be done here:
https://github.com/php/php-src/blob/PHP-8.0.8/main/streams/filter.c#L471

Or instead of using 

stream->ops->write(stream, bucket->buf, bucket->buflen);

probably call (speculating) https://github.com/php/php-src/blob/PHP-8.0.8/main/streams/streams.c#L1120

Test script:
---------------
<?
  $f = fopen("php://memory", "wb");
  $z = stream_filter_append($f, "zlib.deflate", STREAM_FILTER_WRITE, 6);
  fwrite($f, "Test");
  stream_filter_remove($z);
  echo "Position after remove: " . ftell($f) . "\n"; // 0 reported, should be 6
  echo "Read: " . strlen(fread($f, 1024)) . "\n"; // 0 bytes
  fseek($f, 0);
  echo "Read after seek to the beginning: " . strlen(fread($f, 1024)) . "\n"; // 6 bytes read, so ftell should have reported 6
  fclose($f);
?>


Expected result:
----------------
After a filter is removed if it outputs additional data the underlying stream position (ftell) should be updated accordingly.


Patches

Add a Patch

Pull Requests

Pull requests:

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2021-07-27 11:50 UTC] cmb@php.net
-Assigned To: +Assigned To: cmb
 [2021-07-27 11:50 UTC] cmb@php.net
-Status: Assigned +Status: Open
 [2021-08-10 09:57 UTC] cmb@php.net
The following pull request has been associated:

Patch Name: Fix #81302: Stream position after stream filter removed
On GitHub:  https://github.com/php/php-src/pull/7354
Patch:      https://github.com/php/php-src/pull/7354.patch
 [2021-08-10 10:01 UTC] cmb@php.net
-Status: Assigned +Status: Verified
 [2021-08-10 10:01 UTC] cmb@php.net
> fopen("php://memory", "wb");

By the way, the mode should be "w+b" here (or just "w+"), because
reading from a write only stream shouldn't be supported
(apparently it is for memory streams, though).
 [2021-08-10 14:42 UTC] git@php.net
Automatic comment on behalf of cmb69
Revision: https://github.com/php/php-src/commit/40b31fcc80251170fc9841cc9ff5806e1c96edd4
Log: Fix #81302: Stream position after stream filter removed
 [2021-08-10 14:42 UTC] git@php.net
-Status: Verified +Status: Closed
 
PHP Copyright © 2001-2021 The PHP Group
All rights reserved.
Last updated: Wed Oct 20 05:03:33 2021 UTC