From c2fbff6d0ecd01bca8e3a7657ea2fb9d1fc85fd5 Mon Sep 17 00:00:00 2001 From: Deomid Ryabkov <rojer@cesanta.com> Date: Mon, 9 Apr 2018 22:40:39 +0100 Subject: [PATCH] Fix mg_http_parse_header Per standard, cookies are delimited by `; `. CL: Fix mg_http_parse_header: treat ";" as a delimiter. PUBLISHED_FROM=039243c30f5fabf4a4700a43506f841b3268306a --- mongoose.c | 6 +++--- src/mg_http.c | 6 +++--- test/unit_test.c | 5 ++++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/mongoose.c b/mongoose.c index 1db2ab106..534009b74 100644 --- a/mongoose.c +++ b/mongoose.c @@ -7208,7 +7208,7 @@ void mg_printf_html_escape(struct mg_connection *nc, const char *fmt, ...) { static void mg_http_parse_header_internal(struct mg_str *hdr, const char *var_name, struct altbuf *ab) { - int ch = ' ', ch1 = ',', n = strlen(var_name); + int ch = ' ', ch1 = ',', ch2 = ';', n = strlen(var_name); const char *p, *end = hdr ? hdr->p + hdr->len : NULL, *s = NULL; /* Find where variable starts */ @@ -7221,10 +7221,10 @@ static void mg_http_parse_header_internal(struct mg_str *hdr, if (s != NULL && &s[n + 1] < end) { s += n + 1; if (*s == '"' || *s == '\'') { - ch = ch1 = *s++; + ch = ch1 = ch2 = *s++; } p = s; - while (p < end && p[0] != ch && p[0] != ch1) { + while (p < end && p[0] != ch && p[0] != ch1 && p[0] != ch2) { if (ch != ' ' && p[0] == '\\' && p[1] == ch) p++; altbuf_append(ab, *p++); } diff --git a/src/mg_http.c b/src/mg_http.c index 1fd27d2ac..57531c967 100644 --- a/src/mg_http.c +++ b/src/mg_http.c @@ -1644,7 +1644,7 @@ void mg_printf_html_escape(struct mg_connection *nc, const char *fmt, ...) { static void mg_http_parse_header_internal(struct mg_str *hdr, const char *var_name, struct altbuf *ab) { - int ch = ' ', ch1 = ',', n = strlen(var_name); + int ch = ' ', ch1 = ',', ch2 = ';', n = strlen(var_name); const char *p, *end = hdr ? hdr->p + hdr->len : NULL, *s = NULL; /* Find where variable starts */ @@ -1657,10 +1657,10 @@ static void mg_http_parse_header_internal(struct mg_str *hdr, if (s != NULL && &s[n + 1] < end) { s += n + 1; if (*s == '"' || *s == '\'') { - ch = ch1 = *s++; + ch = ch1 = ch2 = *s++; } p = s; - while (p < end && p[0] != ch && p[0] != ch1) { + while (p < end && p[0] != ch && p[0] != ch1 && p[0] != ch2) { if (ch != ' ' && p[0] == '\\' && p[1] == ch) p++; altbuf_append(ab, *p++); } diff --git a/test/unit_test.c b/test/unit_test.c index 446217b1c..f496b27c5 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -4973,7 +4973,7 @@ static const char *test_buffer_limit(void) { static const char *test_http_parse_header(void) { static struct mg_str h = MG_MK_STR( - "xx=1 kl yy, ert=234 kl=123, " + "xx=1 kl yy, ert=234 kl=123, qq=ww;" "uri=\"/?naii=x,y\";ii=\"12\\\"34\" zz='aa bb',tt=2,gf=\"xx d=1234"); char buf[20]; char *buf2; @@ -5021,6 +5021,9 @@ static const char *test_http_parse_header(void) { ASSERT_EQ(mg_http_parse_header(&h, "tt", buf, sizeof(buf)), 1); ASSERT_STREQ(buf, "2"); ASSERT(mg_http_parse_header(&h, "uri", buf, sizeof(buf)) > 0); + ASSERT_STREQ(buf, "/?naii=x,y"); + ASSERT(mg_http_parse_header(&h, "qq", buf, sizeof(buf)) > 0); + ASSERT_STREQ(buf, "ww"); return NULL; } -- GitLab