[PATCH 0/4] MR496: server: Try to improve error handling.
From: Zebediah Figura <zfigura(a)codeweavers.com> Give sock_dispatch_events() a more consistent scope. --- server/sock.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/server/sock.c b/server/sock.c index b96f81a0ea8..1224c3b4674 100644 --- a/server/sock.c +++ b/server/sock.c @@ -1090,10 +1090,7 @@ static void sock_dispatch_events( struct sock *sock, enum connection_state prevs case SOCK_CONNECTING: if (event & POLLOUT) - { post_socket_event( sock, AFD_POLL_BIT_CONNECT, 0 ); - sock->errors[AFD_POLL_BIT_CONNECT_ERR] = 0; - } if (event & (POLLERR | POLLHUP)) post_socket_event( sock, AFD_POLL_BIT_CONNECT_ERR, error ); break; @@ -1149,6 +1146,7 @@ static void sock_poll_event( struct fd *fd, int event ) { sock->state = SOCK_CONNECTED; sock->connect_time = current_time; + sock->errors[AFD_POLL_BIT_CONNECT_ERR] = 0; } break; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/496
From: Zebediah Figura <zfigura(a)codeweavers.com> As long as we do it for connecting and listening sockets, do it here for the remaining socket types as well. --- server/sock.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/server/sock.c b/server/sock.c index 1224c3b4674..373236cab56 100644 --- a/server/sock.c +++ b/server/sock.c @@ -645,20 +645,35 @@ static inline int sock_error( struct sock *sock ) socklen_t len = sizeof(error); getsockopt( get_unix_fd(sock->fd), SOL_SOCKET, SO_ERROR, (void *)&error, &len); - if (sock->state == SOCK_CONNECTING) + + switch (sock->state) { + case SOCK_UNCONNECTED: + break; + + case SOCK_CONNECTING: if (error) sock->errors[AFD_POLL_BIT_CONNECT_ERR] = error; else error = sock->errors[AFD_POLL_BIT_CONNECT_ERR]; - } - else if (sock->state == SOCK_LISTENING) - { + break; + + case SOCK_LISTENING: if (error) sock->errors[AFD_POLL_BIT_ACCEPT] = error; else error = sock->errors[AFD_POLL_BIT_ACCEPT]; + break; + + case SOCK_CONNECTED: + case SOCK_CONNECTIONLESS: + if (error) + sock->errors[AFD_POLL_BIT_HUP] = error; + else + error = sock->errors[AFD_POLL_BIT_HUP]; + break; } + return error; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/496
From: Zebediah Figura <zfigura(a)codeweavers.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52815 --- dlls/ws2_32/tests/afd.c | 3 ++- server/sock.c | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dlls/ws2_32/tests/afd.c b/dlls/ws2_32/tests/afd.c index 9852d54ecb9..eb525c78c54 100644 --- a/dlls/ws2_32/tests/afd.c +++ b/dlls/ws2_32/tests/afd.c @@ -162,7 +162,8 @@ static void check_poll_(int line, SOCKET s, HANDLE event, int mask, int expect, ok_(__FILE__, line)(out_params.count == 1, "got count %u\n", out_params.count); ok_(__FILE__, line)(out_params.sockets[0].socket == s, "got socket %#Ix\n", out_params.sockets[0].socket); todo_wine_if (todo) ok_(__FILE__, line)(out_params.sockets[0].flags == expect, "got flags %#x\n", out_params.sockets[0].flags); - ok_(__FILE__, line)(!out_params.sockets[0].status, "got status %#x\n", out_params.sockets[0].status); + todo_wine_if (expect & AFD_POLL_RESET) + ok_(__FILE__, line)(!out_params.sockets[0].status, "got status %#x\n", out_params.sockets[0].status); } static void test_poll(void) diff --git a/server/sock.c b/server/sock.c index 373236cab56..a8c0b56c2bc 100644 --- a/server/sock.c +++ b/server/sock.c @@ -1145,6 +1145,9 @@ static void sock_poll_event( struct fd *fd, int event ) if (debug_level) fprintf(stderr, "socket %p select event: %x\n", sock, event); + if (event & (POLLERR | POLLHUP)) + error = sock_error( sock ); + switch (sock->state) { case SOCK_UNCONNECTED: @@ -1153,7 +1156,6 @@ static void sock_poll_event( struct fd *fd, int event ) case SOCK_CONNECTING: if (event & (POLLERR|POLLHUP)) { - error = sock_error( sock ); sock->state = SOCK_UNCONNECTED; event &= ~POLLOUT; } @@ -1166,8 +1168,6 @@ static void sock_poll_event( struct fd *fd, int event ) break; case SOCK_LISTENING: - if (event & (POLLERR|POLLHUP)) - error = sock_error( sock ); break; case SOCK_CONNECTED: -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/496
From: Zebediah Figura <zfigura(a)codeweavers.com> --- server/sock.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/server/sock.c b/server/sock.c index a8c0b56c2bc..53553ab8ee7 100644 --- a/server/sock.c +++ b/server/sock.c @@ -1084,7 +1084,7 @@ static int sock_dispatch_asyncs( struct sock *sock, int event, int error ) return event; } -static void post_socket_event( struct sock *sock, enum afd_poll_bit event_bit, int error ) +static void post_socket_event( struct sock *sock, enum afd_poll_bit event_bit ) { unsigned int event = (1 << event_bit); @@ -1092,11 +1092,10 @@ static void post_socket_event( struct sock *sock, enum afd_poll_bit event_bit, i { sock->pending_events |= event; sock->reported_events |= event; - sock->errors[event_bit] = error; } } -static void sock_dispatch_events( struct sock *sock, enum connection_state prevstate, int event, int error ) +static void sock_dispatch_events( struct sock *sock, enum connection_state prevstate, int event ) { switch (prevstate) { @@ -1105,29 +1104,29 @@ static void sock_dispatch_events( struct sock *sock, enum connection_state prevs case SOCK_CONNECTING: if (event & POLLOUT) - post_socket_event( sock, AFD_POLL_BIT_CONNECT, 0 ); + post_socket_event( sock, AFD_POLL_BIT_CONNECT ); if (event & (POLLERR | POLLHUP)) - post_socket_event( sock, AFD_POLL_BIT_CONNECT_ERR, error ); + post_socket_event( sock, AFD_POLL_BIT_CONNECT_ERR ); break; case SOCK_LISTENING: if (event & (POLLIN | POLLERR | POLLHUP)) - post_socket_event( sock, AFD_POLL_BIT_ACCEPT, error ); + post_socket_event( sock, AFD_POLL_BIT_ACCEPT ); break; case SOCK_CONNECTED: case SOCK_CONNECTIONLESS: if (event & POLLIN) - post_socket_event( sock, AFD_POLL_BIT_READ, 0 ); + post_socket_event( sock, AFD_POLL_BIT_READ ); if (event & POLLOUT) - post_socket_event( sock, AFD_POLL_BIT_WRITE, 0 ); + post_socket_event( sock, AFD_POLL_BIT_WRITE ); if (event & POLLPRI) - post_socket_event( sock, AFD_POLL_BIT_OOB, 0 ); + post_socket_event( sock, AFD_POLL_BIT_OOB ); if (event & (POLLERR | POLLHUP)) - post_socket_event( sock, AFD_POLL_BIT_HUP, error ); + post_socket_event( sock, AFD_POLL_BIT_HUP ); break; } @@ -1194,6 +1193,7 @@ static void sock_poll_event( struct fd *fd, int event ) { error = errno; event |= POLLERR; + sock->errors[AFD_POLL_BIT_HUP] = error; if ( debug_level ) fprintf( stderr, "recv error on socket %p: %d\n", sock, errno ); } @@ -1218,7 +1218,7 @@ static void sock_poll_event( struct fd *fd, int event ) } event = sock_dispatch_asyncs( sock, event, error ); - sock_dispatch_events( sock, prevstate, event, error ); + sock_dispatch_events( sock, prevstate, event ); complete_async_polls( sock, event, error ); sock_reselect( sock ); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/496
participants (2)
-
Zebediah Figura -
Zebediah Figura (@zfigura)