From 5c0bcf49a89313d310882a5ed4388a609031a0a5 Mon Sep 17 00:00:00 2001 From: Andy Green Date: Wed, 24 Feb 2016 21:27:46 +0800 Subject: [PATCH] defeat POLLOUT if socket in shutdown wait After andrejs.hanins@ubnt.com Signed-off-by: Andy Green --- changelog | 4 ++++ lib/libwebsockets.c | 3 ++- lib/pollfd.c | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/changelog b/changelog index be8c817..db66e9d 100644 --- a/changelog +++ b/changelog @@ -13,6 +13,10 @@ it. attack.sh updated to add a test for this. 3) MINOR An error about hdr struct in _lws_ws_related is corrected, it's not known to affect anything until after it was fixed +4) MINOR During the close shutdown wait state introduced at v1.7, if something +requests callback on writeable for the socket it will busywait until the +socket closes + Changes ------- diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index 26d8868..b4bac9f 100644 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -299,8 +299,9 @@ just_kill_connection: n = shutdown(wsi->sock, SHUT_WR); if (n) lwsl_debug("closing: shutdown ret %d\n", LWS_ERRNO); - wsi->state = LWSS_SHUTDOWN; + lws_change_pollfd(wsi, LWS_POLLOUT, LWS_POLLIN); + wsi->state = LWSS_SHUTDOWN; lws_set_timeout(wsi, PENDING_TIMEOUT_SHUTDOWN_FLUSH, context->timeout_secs); return; diff --git a/lib/pollfd.c b/lib/pollfd.c index fb86fbd..65a28e4 100644 --- a/lib/pollfd.c +++ b/lib/pollfd.c @@ -277,7 +277,12 @@ lws_callback_on_writable(struct lws *wsi) #ifdef LWS_USE_HTTP2 struct lws *network_wsi, *wsi2; int already; +#endif + + if (wsi->state == LWSS_SHUTDOWN) + return 0; +#ifdef LWS_USE_HTTP2 lwsl_info("%s: %p\n", __func__, wsi); if (wsi->mode != LWSCM_HTTP2_SERVING) -- 2.7.4