From 768f7cf5f1400032752c25ad1271bddd84bf71a2 Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Tue, 10 Aug 2021 11:55:18 +0200 Subject: [PATCH] Fix #81302: Stream position after stream filter removed When flushing the stream filters actually causes data to be written to the stream, we need to update its position, because that is not done by the streams' write methods. --- ext/standard/tests/filters/bug81302.phpt | 20 ++++++++++++++++++++ main/streams/filter.c | 5 ++++- 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 ext/standard/tests/filters/bug81302.phpt diff --git a/ext/standard/tests/filters/bug81302.phpt b/ext/standard/tests/filters/bug81302.phpt new file mode 100644 index 0000000000000..c78ecace125a7 --- /dev/null +++ b/ext/standard/tests/filters/bug81302.phpt @@ -0,0 +1,20 @@ +--TEST-- +Bug #81302 (Stream position after stream filter removed) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) diff --git a/main/streams/filter.c b/main/streams/filter.c index a86b6b16d7a88..08cc015cac9d9 100644 --- a/main/streams/filter.c +++ b/main/streams/filter.c @@ -470,7 +470,10 @@ PHPAPI int _php_stream_filter_flush(php_stream_filter *filter, int finish) } else if (chain == &(stream->writefilters)) { /* Send flushed data to the stream */ while ((bucket = inp->head)) { - stream->ops->write(stream, bucket->buf, bucket->buflen); + ssize_t count = stream->ops->write(stream, bucket->buf, bucket->buflen); + if (count > 0) { + stream->position += count; + } php_stream_bucket_unlink(bucket); php_stream_bucket_delref(bucket); }