From 4ba798dd7d214617c3d01c3b539db541e02c5f9e Mon Sep 17 00:00:00 2001 From: Andy Green Date: Thu, 25 Feb 2016 21:50:49 +0800 Subject: [PATCH] close wsi must do detatch ah flow even if no ah Signed-off-by: Andy Green --- changelog | 3 +++ lib/libwebsockets.c | 7 ++++--- lib/parsers.c | 23 +++++++++++------------ 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/changelog b/changelog index 4da56ba..0af359b 100644 --- a/changelog +++ b/changelog @@ -27,6 +27,9 @@ when it finishes replying to a transaction in http. Previously the library did it for you, but that disallowed large, long transfers with multiple trips around the event loop (and cgi...). +6) MAJOR connections on ah waiting list that closed did not get removed from +the waiting list... + Changes ------- diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c index 42c6c81..8d166b0 100644 --- a/lib/libwebsockets.c +++ b/lib/libwebsockets.c @@ -58,11 +58,12 @@ lws_free_wsi(struct lws *wsi) lws_free_set_NULL(wsi->rxflow_buffer); lws_free_set_NULL(wsi->trunc_alloc); - if (wsi->u.hdr.ah) { + if (wsi->u.hdr.ah) /* we're closing, losing some rx is OK */ wsi->u.hdr.ah->rxpos = wsi->u.hdr.ah->rxlen; - lws_header_table_detach(wsi); - } + + /* we may not have an ah, but may be on the waiting list... */ + lws_header_table_detach(wsi); wsi->context->count_wsi_allocated--; lwsl_debug("%s: %p, remaining wsi %d\n", __func__, wsi, diff --git a/lib/parsers.c b/lib/parsers.c index 0e36eee..d505ee4 100644 --- a/lib/parsers.c +++ b/lib/parsers.c @@ -203,19 +203,18 @@ int lws_header_table_detach(struct lws *wsi) pwsi = &pt->ah_wait_list; if (!ah) { /* remove from wait list if none attached */ -// if (wsi->socket_is_permanently_unusable) - while (*pwsi) { - if (*pwsi == wsi) { - lwsl_info("%s: wsi %p, remv wait\n", - __func__, wsi); - *pwsi = wsi->u.hdr.ah_wait_list; - wsi->u.hdr.ah_wait_list = NULL; - pt->ah_wait_list_length--; - goto bail; - } - pwsi = &(*pwsi)->u.hdr.ah_wait_list; + while (*pwsi) { + if (*pwsi == wsi) { + lwsl_info("%s: wsi %p, remv wait\n", + __func__, wsi); + *pwsi = wsi->u.hdr.ah_wait_list; + wsi->u.hdr.ah_wait_list = NULL; + pt->ah_wait_list_length--; + goto bail; } - + pwsi = &(*pwsi)->u.hdr.ah_wait_list; + } + /* no ah, not on list... no more business here */ goto bail; } /* we did have an ah attached */ -- 2.7.4