diff --git a/ext/standard/tests/filters/stream_filter_remove_compact_read_buffer.phpt b/ext/standard/tests/filters/stream_filter_remove_compact_read_buffer.phpt new file mode 100644 index 000000000000..7cfef971e7e7 --- /dev/null +++ b/ext/standard/tests/filters/stream_filter_remove_compact_read_buffer.phpt @@ -0,0 +1,31 @@ +--TEST-- +stream_filter_remove() compacts unread data before appending flushed data +--FILE-- +datalen; + stream_bucket_append($out, $bucket); + } + if ($closing) { + stream_bucket_append($out, stream_bucket_new($this->stream, 'END')); + } + return PSFS_PASS_ON; + } +} +stream_filter_register('closing-suffix', ClosingSuffixFilter::class); +$stream = fopen('php://memory', 'w+'); +fwrite($stream, 'abcdef'); +rewind($stream); +$filter = stream_filter_append($stream, 'closing-suffix', STREAM_FILTER_READ); +var_dump(fread($stream, 2)); +var_dump(stream_filter_remove($filter)); +var_dump(stream_get_contents($stream)); +?> +--EXPECT-- +string(2) "ab" +bool(true) +string(7) "cdefEND" diff --git a/main/streams/filter.c b/main/streams/filter.c index 967be5d7f724..edf0a01e46fc 100644 --- a/main/streams/filter.c +++ b/main/streams/filter.c @@ -459,9 +459,9 @@ PHPAPI int _php_stream_filter_flush(php_stream_filter *filter, int finish) /* Dump any newly flushed data to the read buffer */ if (stream->readpos > 0) { /* Back the buffer up */ - memcpy(stream->readbuf, stream->readbuf + stream->readpos, stream->writepos - stream->readpos); - stream->readpos = 0; + memmove(stream->readbuf, stream->readbuf + stream->readpos, stream->writepos - stream->readpos); stream->writepos -= stream->readpos; + stream->readpos = 0; } if (flushed_size > (stream->readbuflen - stream->writepos)) { /* Grow the buffer */