diff options
author | Konstantin Kopachev <tenzzor@gmail.com> | 2018-09-17 21:44:01 -0700 |
---|---|---|
committer | Joe Watkins <krakjoe@php.net> | 2019-10-03 06:50:43 +0200 |
commit | 05560b67bc87a2bcbfd5b48a48443a62f3311e7d (patch) | |
tree | eda0a78887a15d6a8e6c6852ea0d6d7572f8430c /ext/standard/tests | |
parent | f2fb37a772908a9331e67f583fddcc4b1b186ccf (diff) | |
download | php-git-05560b67bc87a2bcbfd5b48a48443a62f3311e7d.tar.gz |
Fix #76859 stream_get_line skips data if used with data-generating filter
stream_get-line repeatedly calls php_stream_fill_read_buffer until
enough data is accumulated in buffer. However, when stream contains
filters attached to it, then each call to fill buffer essentially
resets buffer read/write pointers and new data is written over old.
This causes stream_get_line to skip parts of data from stream
This patch fixes such behavior, so fill buffer call will append.
Diffstat (limited to 'ext/standard/tests')
-rw-r--r-- | ext/standard/tests/streams/bug46147.phpt | 14 | ||||
-rw-r--r-- | ext/standard/tests/streams/bug76859.phpt | 22 |
2 files changed, 36 insertions, 0 deletions
diff --git a/ext/standard/tests/streams/bug46147.phpt b/ext/standard/tests/streams/bug46147.phpt new file mode 100644 index 0000000000..bed2ee5472 --- /dev/null +++ b/ext/standard/tests/streams/bug46147.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #46147 (after stream seek, appending stream filter reads incorrect data) +--FILE-- +<?php +$fp = tmpfile(); +fwrite($fp, "this is a lowercase string.\n"); +fseek($fp, 5); +stream_filter_append($fp, "string.toupper"); +while (!feof($fp)) { + echo fread($fp, 5); +} + +--EXPECT-- +IS A LOWERCASE STRING. diff --git a/ext/standard/tests/streams/bug76859.phpt b/ext/standard/tests/streams/bug76859.phpt new file mode 100644 index 0000000000..268b06a01b --- /dev/null +++ b/ext/standard/tests/streams/bug76859.phpt @@ -0,0 +1,22 @@ +--TEST-- +Bug #76859 (stream_get_line skips data if used with filters) +--FILE-- +<?php + +$data = '123'; + +$fh = fopen('php://memory', 'r+b'); +fwrite($fh, $data); +rewind($fh); +stream_filter_append($fh, 'string.rot13', STREAM_FILTER_READ); + +$out = ''; +while (!feof($fh)) { + $out .= stream_get_line($fh, 1024); +} + +fclose($fh); + +echo strlen($out) . "\n"; +--EXPECT-- +3 |