diff --git a/lib/roles/http/parsers.c b/lib/roles/http/parsers.c index cb405fd78..fef1c475e 100644 --- a/lib/roles/http/parsers.c +++ b/lib/roles/http/parsers.c @@ -490,8 +490,8 @@ int lws_hdr_total_length(struct lws *wsi, enum lws_token_indexes h) len += wsi->http.ah->frags[n].len; n = wsi->http.ah->frags[n].nfrag; - if (n && h != WSI_TOKEN_HTTP_COOKIE) - ++len; + if (n) + len++; } while (n); @@ -532,9 +532,7 @@ int lws_hdr_copy_fragment(struct lws *wsi, char *dst, int len, int lws_hdr_copy(struct lws *wsi, char *dst, int len, enum lws_token_indexes h) { - int toklen = lws_hdr_total_length(wsi, h); - int n; - int comma; + int toklen = lws_hdr_total_length(wsi, h), n, comma; *dst = '\0'; if (!toklen) @@ -548,7 +546,8 @@ int lws_hdr_copy(struct lws *wsi, char *dst, int len, n = wsi->http.ah->frag_index[h]; if (h == WSI_TOKEN_HTTP_URI_ARGS) - lwsl_err("%s: WSI_TOKEN_HTTP_URI_ARGS start frag %d\n", __func__, n); + lwsl_err("%s: WSI_TOKEN_HTTP_URI_ARGS start frag %d\n", + __func__, n); if (!n) @@ -557,7 +556,10 @@ int lws_hdr_copy(struct lws *wsi, char *dst, int len, comma = (wsi->http.ah->frags[n].nfrag) ? 1 : 0; if (h == WSI_TOKEN_HTTP_URI_ARGS) - lwsl_notice("%s: WSI_TOKEN_HTTP_URI_ARGS '%.*s'\n", __func__, (int)wsi->http.ah->frags[n].len, &wsi->http.ah->data[wsi->http.ah->frags[n].offset]); + lwsl_notice("%s: WSI_TOKEN_HTTP_URI_ARGS '%.*s'\n", + __func__, (int)wsi->http.ah->frags[n].len, + &wsi->http.ah->data[ + wsi->http.ah->frags[n].offset]); if (wsi->http.ah->frags[n].len + comma >= len) { lwsl_notice("blowout len\n"); @@ -569,14 +571,22 @@ int lws_hdr_copy(struct lws *wsi, char *dst, int len, len -= wsi->http.ah->frags[n].len; n = wsi->http.ah->frags[n].nfrag; + /* + * Note if you change this logic, take care about updating len + * and make sure lws_hdr_total_length() gives the same resulting + * length + */ + if (comma) { - if (h == WSI_TOKEN_HTTP_COOKIE || h == WSI_TOKEN_HTTP_SET_COOKIE) + if (h == WSI_TOKEN_HTTP_COOKIE || + h == WSI_TOKEN_HTTP_SET_COOKIE) *dst++ = ';'; else if (h == WSI_TOKEN_HTTP_URI_ARGS) *dst++ = '&'; else *dst++ = ','; + len--; } } while (n);