close wsi must do detatch ah flow even if no ah
authorAndy Green <andy.green@linaro.org>
Thu, 25 Feb 2016 13:50:49 +0000 (21:50 +0800)
committerAndy Green <andy.green@linaro.org>
Thu, 25 Feb 2016 13:50:49 +0000 (21:50 +0800)
Signed-off-by: Andy Green <andy.green@linaro.org>
changelog
lib/libwebsockets.c
lib/parsers.c

index 4da56ba..0af359b 100644 (file)
--- 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
 -------
index 42c6c81..8d166b0 100644 (file)
@@ -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,
index 0e36eee..d505ee4 100644 (file)
@@ -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 */