]> granicus.if.org Git - php/commitdiff
Fixed bug #54946 (stream_get_contents infinite loop)
authorHannes Magnusson <bjori@php.net>
Sun, 29 May 2011 12:29:19 +0000 (12:29 +0000)
committerHannes Magnusson <bjori@php.net>
Sun, 29 May 2011 12:29:19 +0000 (12:29 +0000)
ext/standard/tests/streams/bug54946.phpt [new file with mode: 0644]
main/streams/streams.c

diff --git a/ext/standard/tests/streams/bug54946.phpt b/ext/standard/tests/streams/bug54946.phpt
new file mode 100644 (file)
index 0000000..b3fa73d
--- /dev/null
@@ -0,0 +1,40 @@
+--TEST--
+Bug#54946 stream_get_contents infinite loop
+--FILE--
+<?php
+$filename = tempnam(sys_get_temp_dir(), "phpbug");
+
+$stream = fopen($filename, "w"); // w or a
+$retval = stream_get_contents($stream, 1, 1);
+
+var_dump($retval);
+unlink($filename);
+
+
+
+$filename = tempnam(sys_get_temp_dir(), "phpbug2");
+
+$stream = fopen($filename, "a");
+$retval = stream_get_contents($stream, 1, 1);
+
+var_dump($retval);
+unlink($filename);
+
+
+
+$filename = tempnam(sys_get_temp_dir(), "phpbug3");
+
+$stream = fopen($filename, "a");
+fseek($stream, 1);
+$retval = stream_get_contents($stream, 1);
+
+var_dump($retval);
+unlink($filename);
+?>
+===DONE===
+--EXPECT--
+string(0) ""
+string(0) ""
+string(0) ""
+===DONE===
+
index 4a227e8f02d8285658278d785554752006e2a1a1..1017f221241cc0a3358fbab25aa4c78a74192aa1 100755 (executable)
@@ -1362,6 +1362,9 @@ PHPAPI size_t _php_stream_copy_to_mem(php_stream *src, char **buf, size_t maxlen
                ptr = *buf = pemalloc_rel_orig(maxlen + 1, persistent);
                while ((len < maxlen) && !php_stream_eof(src)) {
                        ret = php_stream_read(src, ptr, maxlen - len);
+                       if (!ret) {
+                               break;
+                       }
                        len += ret;
                        ptr += ret;
                }