]> granicus.if.org Git - php/commitdiff
Fixed bug #70198 Checking liveness does not work as expected
authorAnatol Belski <ab@php.net>
Tue, 11 Aug 2015 12:40:34 +0000 (14:40 +0200)
committerAnatol Belski <ab@php.net>
Tue, 11 Aug 2015 12:40:34 +0000 (14:40 +0200)
main/streams/xp_socket.c

index 13ed7036826c32dd811a7859ef4198fa6c0c45e8..300a58e491d88336980c0cf0e39230148228e0b5 100644 (file)
@@ -314,7 +314,17 @@ static int php_sockop_set_option(php_stream *stream, int option, int value, void
                                if (sock->socket == -1) {
                                        alive = 0;
                                } else if (php_pollfd_for(sock->socket, PHP_POLLREADABLE|POLLPRI, &tv) > 0) {
-                                       if (0 >= recv(sock->socket, &buf, sizeof(buf), MSG_PEEK) && php_socket_errno() != EWOULDBLOCK) {
+#ifdef PHP_WIN32
+                                       int ret;
+#else
+                                       ssize_t ret;
+#endif
+                                       int err;
+
+                                       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 */
                                                alive = 0;
                                        }
                                }