Sebastian Lackner : ws2_32: Properly handle closing sockets during a select call.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue May 5 09:50:51 CDT 2015
Module: wine
Branch: master
Commit: 0d2817b161e7c363c1fab523b6645002e980597a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0d2817b161e7c363c1fab523b6645002e980597a
Author: Sebastian Lackner <sebastian at fds-team.de>
Date: Thu Apr 30 05:43:26 2015 +0200
ws2_32: Properly handle closing sockets during a select call.
Based on a patch by Bruno Jesus.
---
dlls/ws2_32/socket.c | 13 ++++++++++++-
dlls/ws2_32/tests/sock.c | 1 -
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index ef43186..10bfd9d 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -4773,7 +4773,18 @@ static void release_poll_fds( const WS_fd_set *readfds, const WS_fd_set *writefd
if (exceptfds)
{
for (i = 0; i < exceptfds->fd_count; i++, j++)
- if (fds[j].fd != -1) release_sock_fd( exceptfds->fd_array[i], fds[j].fd );
+ {
+ if (fds[j].fd == -1) continue;
+ release_sock_fd( exceptfds->fd_array[i], fds[j].fd );
+ if (fds[j].revents & POLLHUP)
+ {
+ int fd = get_sock_fd( exceptfds->fd_array[i], 0, NULL );
+ if (fd != -1)
+ release_sock_fd( exceptfds->fd_array[i], fd );
+ else
+ fds[j].revents = 0;
+ }
+ }
}
}
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index f31539f..d67a47d 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -3834,7 +3834,6 @@ todo_wine
FD_ZERO_ALL();
FD_SET_ALL(fdWrite);
ret = select(0, &readfds, NULL, &exceptfds, &select_timeout);
-todo_wine
ok(ret == 1, "expected 1, got %d\n", ret);
ok(FD_ISSET(fdWrite, &readfds), "fdWrite socket is not in the set\n");
WaitForSingleObject (thread_handle, 1000);
More information about the wine-cvs
mailing list