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...).
 
 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
 -------
 
 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);
 
        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;
                /* 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,
 
        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 */
 
        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 */
                goto bail;
        }
        /* we did have an ah attached */