From: Gustavo André dos Santos Lopes Date: Sun, 11 Dec 2011 21:08:15 +0000 (+0000) Subject: - Fixed bug #60455: stream_get_line misbehaves if EOF is not detected together X-Git-Tag: php-5.5.0alpha1~731 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=faec3c51110baa0269124832274d138c48f86d0f;p=php - Fixed bug #60455: stream_get_line misbehaves if EOF is not detected together with the last read. --- diff --git a/ext/standard/tests/streams/bug60455_01.phpt b/ext/standard/tests/streams/bug60455_01.phpt new file mode 100644 index 0000000000..466998201a --- /dev/null +++ b/ext/standard/tests/streams/bug60455_01.phpt @@ -0,0 +1,21 @@ +--TEST-- +Bug #60455: stream_get_line and 1-line noeol input +--FILE-- +s++ == 0) + return "a\n"; + + return ""; + } + function stream_eof() { + return $this->s >= 2; + } + +} + +stream_wrapper_register("test", "TestStream"); + +$f = fopen("test://", "r"); +while (!feof($f)) { + $line = stream_get_line($f, 99, "\n"); + var_dump($line); +} +--EXPECT-- +string(1) "a" diff --git a/ext/standard/tests/streams/bug60455_03.phpt b/ext/standard/tests/streams/bug60455_03.phpt new file mode 100644 index 0000000000..5d7ba1f248 --- /dev/null +++ b/ext/standard/tests/streams/bug60455_03.phpt @@ -0,0 +1,53 @@ +--TEST-- +Bug #60455: stream_get_line and 2 lines, one possibly empty +--FILE-- +lines[] = "a\n"; + $this->lines[] = ($path == "test://nonempty2nd" ? "b\n" : "\n"); + if ($path == "test://eofafter2nd") + $this->eofth = 2; + return true; + } + function stream_read($count) { + if (key_exists($this->s++, $this->lines)) + return $this->lines[$this->s - 1]; + + return ""; + } + function stream_eof() { + return $this->s >= $this->eofth; + } + +} + +stream_wrapper_register("test", "TestStream"); + +$f = fopen("test://nonempty2nd", "r"); +while (!feof($f)) { + $line = stream_get_line($f, 99, "\n"); + var_dump($line); +} +$f = fopen("test://", "r"); +while (!feof($f)) { + $line = stream_get_line($f, 99, "\n"); + var_dump($line); +} +$f = fopen("test://eofafter2nd", "r"); +while (!feof($f)) { + $line = stream_get_line($f, 99, "\n"); + var_dump($line); +} + + +--EXPECT-- +string(1) "a" +string(1) "b" +string(1) "a" +string(0) "" +string(1) "a" +string(0) "" diff --git a/main/streams/streams.c b/main/streams/streams.c index 4679a97aa6..d396de30d2 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -989,9 +989,8 @@ PHPAPI char *php_stream_get_record(php_stream *stream, size_t maxlen, size_t *re just_read = (stream->writepos - stream->readpos) - len; len += just_read; - /* read operation have less data than request; assume the stream is - * temporarily or permanently out of data */ - if (just_read < toread) { + /* Assume the stream is temporarily or permanently out of data */ + if (just_read == 0) { break; } }