]> granicus.if.org Git - php/commitdiff
Fixed bug #48307 (stream_copy_to_stream() copies 0 bytes when $source
authorArnaud Le Blanc <lbarnaud@php.net>
Sat, 16 May 2009 20:22:29 +0000 (20:22 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Sat, 16 May 2009 20:22:29 +0000 (20:22 +0000)
is a socket)

ext/standard/tests/streams/stream_copy_to_stream_socket.phpt [new file with mode: 0644]
main/streams/streams.c

diff --git a/ext/standard/tests/streams/stream_copy_to_stream_socket.phpt b/ext/standard/tests/streams/stream_copy_to_stream_socket.phpt
new file mode 100644 (file)
index 0000000..7e304b1
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+stream_copy_to_stream() with socket as $source
+--SKIPIF--
+<?php
+$sockets = @stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, 0);
+if (!$sockets) die("skip stream_socket_pair");
+?>
+--FILE--
+<?php
+
+$sockets = stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, 0);
+$tmp = tmpfile();
+
+fwrite($sockets[0], b"a");
+stream_socket_shutdown($sockets[0], STREAM_SHUT_WR);
+stream_copy_to_stream($sockets[1], $tmp);
+
+fseek($tmp, 0, SEEK_SET);
+var_dump(stream_get_contents($tmp));
+
+stream_copy_to_stream($sockets[1], $tmp);
+
+fseek($tmp, 0, SEEK_SET);
+var_dump(stream_get_contents($tmp));
+
+
+?>
+--EXPECT--
+string(1) "a"
+string(1) "a"
index 9dd9135097875ce44f5591f8d89f9a81bacf3067..e953a1690f70066752ee69be0e1512bbbbe5a68e 100755 (executable)
@@ -1794,11 +1794,8 @@ PHPAPI size_t _php_stream_ucopy_to_stream_ex(php_stream *src, php_stream *dest,
 
        if (php_stream_stat(src, &ssbuf) == 0) {
                if (ssbuf.sb.st_size == 0
-#ifdef S_ISFIFO
-                && !S_ISFIFO(ssbuf.sb.st_mode)
-#endif
-#ifdef S_ISCHR
-                && !S_ISCHR(ssbuf.sb.st_mode)
+#ifdef S_ISREG
+                       && S_ISREG(ssbuf.sb.st_mode)
 #endif
                ) {
                        *len = 0;
@@ -1901,11 +1898,8 @@ PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, s
 
        if (php_stream_stat(src, &ssbuf) == 0) {
                if (ssbuf.sb.st_size == 0
-#ifdef S_ISFIFO
-                && !S_ISFIFO(ssbuf.sb.st_mode)
-#endif
-#ifdef S_ISCHR
-                && !S_ISCHR(ssbuf.sb.st_mode)
+#ifdef S_ISREG
+                       && S_ISREG(ssbuf.sb.st_mode)
 #endif
                ) {
                        *len = 0;