]> granicus.if.org Git - php/commitdiff
Fixed bug #74090 stream_get_contents maxlength>-1 returns empty string
authorAnatol Belski <ab@php.net>
Wed, 15 Feb 2017 10:22:47 +0000 (11:22 +0100)
committerAnatol Belski <ab@php.net>
Wed, 15 Feb 2017 10:22:47 +0000 (11:22 +0100)
ext/standard/tests/streams/bug74090.phpt [new file with mode: 0644]
main/streams/php_streams_int.h
main/streams/xp_socket.c

diff --git a/ext/standard/tests/streams/bug74090.phpt b/ext/standard/tests/streams/bug74090.phpt
new file mode 100644 (file)
index 0000000..370dd13
--- /dev/null
@@ -0,0 +1,22 @@
+--TEST--\r
+Bug #74090 stream_get_contents maxlength>-1 returns empty string on windows\r
+--SKIPIF--\r
+<?php\r
+if (getenv("SKIP_ONLINE_TESTS")) { die('skip: online test'); }\r
+if (getenv("SKIP_SLOW_TESTS")) { die('skip: slow test'); }\r
+?>\r
+--FILE--\r
+<?php\r
+$data = base64_decode("1oIBAAABAAAAAAAAB2V4YW1wbGUDb3JnAAABAAE=");\r
+$fd = stream_socket_client("udp://8.8.8.8:53", $errno, $errstr, 0, STREAM_CLIENT_CONNECT | STREAM_CLIENT_ASYNC_CONNECT);\r
+stream_set_blocking($fd, 0);\r
+stream_socket_sendto($fd,$data);\r
+sleep(1);\r
+$ret = stream_get_contents($fd,65565);\r
+var_dump(strlen($ret) > 0);\r
+stream_socket_shutdown($fd,STREAM_SHUT_RDWR);\r
+?>\r
+==DONE==\r
+--EXPECTF--\r
+bool(true)\r
+==DONE==\r
index 42fdfcb4c733dfda537dd5a913739449270e59ba..13a817833f828242905b44939688adc4d1243327 100644 (file)
 #  undef EWOULDBLOCK
 # endif
 # define EWOULDBLOCK WSAEWOULDBLOCK
+# ifdef EMSGSIZE
+#  undef EMSGSIZE
+# endif
+# define EMSGSIZE WSAEMSGSIZE
 #endif
 
 /* This functions transforms the first char to 'w' if it's not 'r', 'a' or 'w'
index a791621a204a9813e688cee5fc514535b96b5642..701a993ccc1d474a019ca6478f99a7f96c69a96c 100644 (file)
@@ -336,7 +336,7 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void
                                        ret = recv(sock->socket, &buf, sizeof(buf), MSG_PEEK);
                                        err = php_socket_errno();
                                        if (0 == ret || /* the counterpart did properly shutdown*/
-                                               (0 > ret && err != EWOULDBLOCK && err != EAGAIN)) { /* there was an unrecoverable error */
+                                               (0 > ret && err != EWOULDBLOCK && err != EAGAIN && err != EMSGSIZE)) { /* there was an unrecoverable error */
                                                alive = 0;
                                        }
                                }