From 5c0bcf49a89313d310882a5ed4388a609031a0a5 Mon Sep 17 00:00:00 2001
From: Andy Green <andy.green@linaro.org>
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 <andy.green@linaro.org>
---
 changelog           | 4 ++++
 lib/libwebsockets.c | 3 ++-
 lib/pollfd.c        | 5 +++++
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/changelog b/changelog
index be8c8172..db66e9d4 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 26d8868e..b4bac9f3 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 fb86fbd4..65a28e41 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)
-- 
GitLab