close wsi must do detatch ah flow even if no ah

Signed-off-by: Andy Green <andy.green@linaro.org>
This commit is contained in:
Andy Green 2016-02-25 21:55:06 +08:00
parent 12369b0c91
commit 00aaa3aa12
3 changed files with 23 additions and 15 deletions

View file

@ -1,6 +1,13 @@
Changelog
---------
Fixes
-----
1) MAJOR connections on ah waiting list that closed did not get removed from
the waiting list...
v1.7.2
======
@ -41,6 +48,7 @@ Fixes
get sent a content-length resulting in the link hanging until the peer closed
it. attack.sh updated to add a test for this.
Changes
-------

View file

@ -53,11 +53,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,

View file

@ -190,19 +190,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 */