]> 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 15:36:10 +0000 (17:36 +0200)
committerAnatol Belski <ab@php.net>
Tue, 11 Aug 2015 15:36:10 +0000 (17:36 +0200)
main/streams/xp_socket.c

index ee06f26bf205204a395e04f432f30f4574363902..c4846d854130280bc33041ffd9dfa4a8ac5a1d5f 100644 (file)
@@ -293,7 +293,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;
                                        }
                                }