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

Reply via email to