Re: server: fix connect failures on newer kernels
On Mon, Jan 24, 2011 at 12:21:15AM -0500, Mike Kaplinskiy wrote:
For some reason the newer kernels report POLLOUT|POLLERR|POLLHUP when connect() fails. Strip the POLLOUT in this case. This (hopefully) fixes bug 25456.
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c index 1b81544..3c6425e 100644 --- a/dlls/ws2_32/tests/sock.c +++ b/dlls/ws2_32/tests/sock.c @@ -3965,7 +3965,7 @@ static void test_ConnectEx(void) closesocket(listener); listener = INVALID_SOCKET;
- address.sin_port = 1; + address.sin_port = htons(1);
bret = pConnectEx(connector, (struct sockaddr*)&address, addrlen, NULL, 0, &bytesReturned, &overlapped); ok(bret == FALSE && GetLastError(), "ConnectEx to bad destination failed: " diff --git a/server/sock.c b/server/sock.c index d37a316..134efb0 100644 --- a/server/sock.c +++ b/server/sock.c @@ -388,6 +388,9 @@ static void sock_poll_event( struct fd *fd, int event )
if (sock->state & FD_CONNECT) { + if (event & POLLOUT && event & (POLLERR|POLLHUP)) + event &= ~POLLOUT;
Add more braces to make the operator precedence a bit more clear... (just a style issue though) Ciao, Marcus
Marcus Meissner <marcus(a)jet.franken.de> wrote:
diff --git a/server/sock.c b/server/sock.c index d37a316..134efb0 100644 --- a/server/sock.c +++ b/server/sock.c @@ -388,6 +388,9 @@ static void sock_poll_event( struct fd *fd, int event )
if (sock->state & FD_CONNECT) { + if (event & POLLOUT && event & (POLLERR|POLLHUP)) + event &= ~POLLOUT;
Add more braces to make the operator precedence a bit more clear... (just a style issue though)
Or probably more simple if (event & (POLLERR|POLLHUP)) event &= ~POLLOUT; -- Dmitry.
participants (2)
-
Dmitry Timoshkov -
Marcus Meissner