make duplicate headers append instead of get ignored
authorNick Dowell <nick@nickdowell.com>
Thu, 5 Apr 2012 02:31:48 +0000 (10:31 +0800)
committerAndy Green <andy.green@linaro.org>
Thu, 5 Apr 2012 02:31:48 +0000 (10:31 +0800)
The code to prevent memory leaks caused by reallocating a wsi->utf8_token
was also causing wsi->parser_state to not be updated, preventing the
handshake from completing.

This patch changes the logic to append to previous allocation which is
correct behaviour actually.

Signed-off-by: Nick Dowell <nick@nickdowell.com>
Signed-off-by: Andy Green <andy@warmcat.com>
lib/parsers.c

index 120d22a..c3bf7ae 100644 (file)
@@ -190,17 +190,18 @@ int libwebsocket_parse(struct libwebsocket *wsi, unsigned char c)
                        if (n == WSI_TOKEN_SWORIGIN)
                                n = WSI_TOKEN_ORIGIN;
 
-                       /* check for dupe header -> mem leak... skip dupes */
-                        if (wsi->utf8_token[WSI_TOKEN_GET_URI + n].token)
-                                continue;
-
                        wsi->parser_state = WSI_TOKEN_GET_URI + n;
-                       wsi->current_alloc_len = LWS_INITIAL_HDR_ALLOC;
 
+                       n = WSI_TOKEN_COUNT;
+
+                       /*  If the header has been seen already, just append */
+                       if (wsi->utf8_token[wsi->parser_state].token)
+                               continue;
+
+                       wsi->current_alloc_len = LWS_INITIAL_HDR_ALLOC;
                        wsi->utf8_token[wsi->parser_state].token =
-                                                malloc(wsi->current_alloc_len);
+                                                        malloc(wsi->current_alloc_len);
                        wsi->utf8_token[wsi->parser_state].token_len = 0;
-                       n = WSI_TOKEN_COUNT;
                }
 
                /* colon delimiter means we just don't know this name */