From a549245dfc2e5c89aa21b30486237e2e889d99c7 Mon Sep 17 00:00:00 2001 From: Bruno Jesus <00cpxxx@gmail.com> Date: Tue, 13 Sep 2016 15:38:15 -0300 Subject: [PATCH] ws2_32: Fix handling of POLLHUP in WSAPoll. Signed-off-by: Bruno Jesus <00cpxxx@gmail.com> Signed-off-by: Alexandre Julliard --- dlls/ws2_32/socket.c | 15 ++++++++++++++- dlls/ws2_32/tests/sock.c | 2 -- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 2d540133b90..9d0b60eed13 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -5378,7 +5378,20 @@ int WINAPI WSAPoll(WSAPOLLFD *wfds, ULONG count, int timeout) if (ufds[i].fd != -1) { release_sock_fd(wfds[i].fd, ufds[i].fd); - wfds[i].revents = convert_poll_u2w(ufds[i].revents); + if (ufds[i].revents & POLLHUP) + { + /* Check if the socket still exists */ + int fd = get_sock_fd(wfds[i].fd, 0, NULL); + if (fd != -1) + { + wfds[i].revents = WS_POLLHUP; + release_sock_fd(wfds[i].fd, fd); + } + else + wfds[i].revents = WS_POLLNVAL; + } + else + wfds[i].revents = convert_poll_u2w(ufds[i].revents); } else wfds[i].revents = WS_POLLNVAL; diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index d216542ba93..320f82096d6 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -6672,7 +6672,6 @@ static void test_WSAPoll(void) POLL_SET(fdWrite, POLLIN); ret = pWSAPoll(fds, ix, poll_timeout); ok(ret == 1, "expected 1, got %d\n", ret); -todo_wine ok(POLL_ISSET(fdWrite, POLLHUP), "fdWrite socket events incorrect\n"); ret = recv(fdWrite, tmp_buf, sizeof(tmp_buf), 0); ok(ret == 0, "expected 0, got %d\n", ret); @@ -6737,7 +6736,6 @@ todo_wine POLL_SET(fdWrite, POLLIN); ret = pWSAPoll(fds, ix, poll_timeout); ok(ret == 1, "expected 1, got %d\n", ret); -todo_wine ok(POLL_ISSET(fdWrite, POLLNVAL), "fdWrite socket events incorrect\n"); WaitForSingleObject (thread_handle, 1000); closesocket(fdRead);