From d5178f477f93bd8d018079710e9f69fe38544dcf Mon Sep 17 00:00:00 2001 From: Andy Green Date: Wed, 6 Jan 2021 15:10:03 +0000 Subject: [PATCH] client: HUP: defer POLLUP handling while buffered rx If the server is very close in rtt to the client, the server hangup may get processed before buffered rx. Make sure we clear buffered rx before dealing with the HUP. --- lib/core-net/service.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/lib/core-net/service.c b/lib/core-net/service.c index 080c271dc..e00bc3717 100644 --- a/lib/core-net/service.c +++ b/lib/core-net/service.c @@ -689,11 +689,16 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, if ((!(pollfd->revents & pollfd->events & LWS_POLLIN)) && (pollfd->revents & LWS_POLLHUP)) { - wsi->socket_is_permanently_unusable = 1; - lwsl_debug("Session Socket %s (fd=%d) dead\n", - lws_wsi_tag(wsi), pollfd->fd); - goto close_and_handled; + if (lws_buflist_total_len(&wsi->buflist)) + lws_set_timeout(wsi, PENDING_TIMEOUT_CLOSE_ACK, 3); + else { + wsi->socket_is_permanently_unusable = 1; + lwsl_debug("Session Socket %s (fd=%d) dead\n", + lws_wsi_tag(wsi), pollfd->fd); + + goto close_and_handled; + } } #ifdef _WIN32 @@ -701,13 +706,6 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, wsi->sock_send_blocking = FALSE; #endif - if ((!(pollfd->revents & pollfd->events & LWS_POLLIN)) && - (pollfd->revents & LWS_POLLHUP)) { - lwsl_debug("pollhup\n"); - wsi->socket_is_permanently_unusable = 1; - goto close_and_handled; - } - #if defined(LWS_WITH_TLS) if (lwsi_state(wsi) == LRS_SHUTDOWN && lws_is_ssl(wsi) && wsi->tls.ssl) {