cataphract Sun, 11 Dec 2011 21:08:15 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=320876
Log: - Fixed bug #60455: stream_get_line misbehaves if EOF is not detected together with the last read. Bug: https://bugs.php.net/60455 (Open) stream_get_line reports two lines instead of one Changed paths: U php/php-src/branches/PHP_5_3/NEWS A php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_01.phpt A php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_02.phpt A php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_03.phpt U php/php-src/branches/PHP_5_3/main/streams/streams.c A php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_01.phpt A php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_02.phpt A php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_03.phpt U php/php-src/branches/PHP_5_4/main/streams/streams.c A php/php-src/trunk/ext/standard/tests/streams/bug60455_01.phpt A php/php-src/trunk/ext/standard/tests/streams/bug60455_02.phpt A php/php-src/trunk/ext/standard/tests/streams/bug60455_03.phpt U php/php-src/trunk/main/streams/streams.c
Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2011-12-11 20:40:36 UTC (rev 320875) +++ php/php-src/branches/PHP_5_3/NEWS 2011-12-11 21:08:15 UTC (rev 320876) @@ -2,6 +2,10 @@ ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ?? ??? 2011, PHP 5.3.9 +- Streams: + . Fixed bug #60455 (stream_get_line misbehaves if EOF is not detected together + with the last read). (Gustavo) + 08 Dec 2011, PHP 5.3.9RC3 - Filter: Added: php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_01.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_01.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_01.phpt 2011-12-11 21:08:15 UTC (rev 320876) @@ -0,0 +1,21 @@ +--TEST-- +Bug #60455: stream_get_line and 1-line noeol input +--FILE-- +<?php + +//It's critical the read on the stream returns the input but doesn't set EOF +//flag the first time. This is why we need to use sockets. + +$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? STREAM_PF_INET : STREAM_PF_UNIX); +$sockets = stream_socket_pair($domain, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP) + or die("stream_socket_pair"); +fwrite($sockets[0], "a"); +stream_socket_shutdown($sockets[0], STREAM_SHUT_RDWR); + +$f = $sockets[1]; +while (!feof($f)) { + $line = stream_get_line($f, 99, "\n"); + var_dump($line); +} +--EXPECT-- +string(1) "a" Property changes on: php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_01.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_02.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_02.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_02.phpt 2011-12-11 21:08:15 UTC (rev 320876) @@ -0,0 +1,30 @@ +--TEST-- +Bug #60455: stream_get_line and 1-line followed by eol input +--FILE-- +<?php +class TestStream { + private $s = 0; + function stream_open($path, $mode, $options, &$opened_path) { + return true; + } + function stream_read($count) { + if ($this->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" Property changes on: php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_02.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_03.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_03.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_03.phpt 2011-12-11 21:08:15 UTC (rev 320876) @@ -0,0 +1,53 @@ +--TEST-- +Bug #60455: stream_get_line and 2 lines, one possibly empty +--FILE-- +<?php +class TestStream { + private $lines = array(); + private $s = 0; + private $eofth = 3; + function stream_open($path, $mode, $options, &$opened_path) { + $this->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) "" Property changes on: php/php-src/branches/PHP_5_3/ext/standard/tests/streams/bug60455_03.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/branches/PHP_5_3/main/streams/streams.c =================================================================== --- php/php-src/branches/PHP_5_3/main/streams/streams.c 2011-12-11 20:40:36 UTC (rev 320875) +++ php/php-src/branches/PHP_5_3/main/streams/streams.c 2011-12-11 21:08:15 UTC (rev 320876) @@ -918,9 +918,8 @@ 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; } } Added: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_01.phpt =================================================================== --- php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_01.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_01.phpt 2011-12-11 21:08:15 UTC (rev 320876) @@ -0,0 +1,21 @@ +--TEST-- +Bug #60455: stream_get_line and 1-line noeol input +--FILE-- +<?php + +//It's critical the read on the stream returns the input but doesn't set EOF +//flag the first time. This is why we need to use sockets. + +$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? STREAM_PF_INET : STREAM_PF_UNIX); +$sockets = stream_socket_pair($domain, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP) + or die("stream_socket_pair"); +fwrite($sockets[0], "a"); +stream_socket_shutdown($sockets[0], STREAM_SHUT_RDWR); + +$f = $sockets[1]; +while (!feof($f)) { + $line = stream_get_line($f, 99, "\n"); + var_dump($line); +} +--EXPECT-- +string(1) "a" Property changes on: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_01.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_02.phpt =================================================================== --- php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_02.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_02.phpt 2011-12-11 21:08:15 UTC (rev 320876) @@ -0,0 +1,30 @@ +--TEST-- +Bug #60455: stream_get_line and 1-line followed by eol input +--FILE-- +<?php +class TestStream { + private $s = 0; + function stream_open($path, $mode, $options, &$opened_path) { + return true; + } + function stream_read($count) { + if ($this->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" Property changes on: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_02.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_03.phpt =================================================================== --- php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_03.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_03.phpt 2011-12-11 21:08:15 UTC (rev 320876) @@ -0,0 +1,53 @@ +--TEST-- +Bug #60455: stream_get_line and 2 lines, one possibly empty +--FILE-- +<?php +class TestStream { + private $lines = array(); + private $s = 0; + private $eofth = 3; + function stream_open($path, $mode, $options, &$opened_path) { + $this->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) "" Property changes on: php/php-src/branches/PHP_5_4/ext/standard/tests/streams/bug60455_03.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/branches/PHP_5_4/main/streams/streams.c =================================================================== --- php/php-src/branches/PHP_5_4/main/streams/streams.c 2011-12-11 20:40:36 UTC (rev 320875) +++ php/php-src/branches/PHP_5_4/main/streams/streams.c 2011-12-11 21:08:15 UTC (rev 320876) @@ -989,9 +989,8 @@ 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; } } Added: php/php-src/trunk/ext/standard/tests/streams/bug60455_01.phpt =================================================================== --- php/php-src/trunk/ext/standard/tests/streams/bug60455_01.phpt (rev 0) +++ php/php-src/trunk/ext/standard/tests/streams/bug60455_01.phpt 2011-12-11 21:08:15 UTC (rev 320876) @@ -0,0 +1,21 @@ +--TEST-- +Bug #60455: stream_get_line and 1-line noeol input +--FILE-- +<?php + +//It's critical the read on the stream returns the input but doesn't set EOF +//flag the first time. This is why we need to use sockets. + +$domain = (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' ? STREAM_PF_INET : STREAM_PF_UNIX); +$sockets = stream_socket_pair($domain, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP) + or die("stream_socket_pair"); +fwrite($sockets[0], "a"); +stream_socket_shutdown($sockets[0], STREAM_SHUT_RDWR); + +$f = $sockets[1]; +while (!feof($f)) { + $line = stream_get_line($f, 99, "\n"); + var_dump($line); +} +--EXPECT-- +string(1) "a" Property changes on: php/php-src/trunk/ext/standard/tests/streams/bug60455_01.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/trunk/ext/standard/tests/streams/bug60455_02.phpt =================================================================== --- php/php-src/trunk/ext/standard/tests/streams/bug60455_02.phpt (rev 0) +++ php/php-src/trunk/ext/standard/tests/streams/bug60455_02.phpt 2011-12-11 21:08:15 UTC (rev 320876) @@ -0,0 +1,30 @@ +--TEST-- +Bug #60455: stream_get_line and 1-line followed by eol input +--FILE-- +<?php +class TestStream { + private $s = 0; + function stream_open($path, $mode, $options, &$opened_path) { + return true; + } + function stream_read($count) { + if ($this->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" Property changes on: php/php-src/trunk/ext/standard/tests/streams/bug60455_02.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/trunk/ext/standard/tests/streams/bug60455_03.phpt =================================================================== --- php/php-src/trunk/ext/standard/tests/streams/bug60455_03.phpt (rev 0) +++ php/php-src/trunk/ext/standard/tests/streams/bug60455_03.phpt 2011-12-11 21:08:15 UTC (rev 320876) @@ -0,0 +1,53 @@ +--TEST-- +Bug #60455: stream_get_line and 2 lines, one possibly empty +--FILE-- +<?php +class TestStream { + private $lines = array(); + private $s = 0; + private $eofth = 3; + function stream_open($path, $mode, $options, &$opened_path) { + $this->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) "" Property changes on: php/php-src/trunk/ext/standard/tests/streams/bug60455_03.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Modified: php/php-src/trunk/main/streams/streams.c =================================================================== --- php/php-src/trunk/main/streams/streams.c 2011-12-11 20:40:36 UTC (rev 320875) +++ php/php-src/trunk/main/streams/streams.c 2011-12-11 21:08:15 UTC (rev 320876) @@ -989,9 +989,8 @@ 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; } }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php