]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
altsvc: fix parser for lines ending with CRLF
authorDaniel Stenberg <daniel@haxx.se>
Mon, 25 May 2020 06:31:08 +0000 (08:31 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 25 May 2020 21:05:27 +0000 (23:05 +0200)
Fixed the alt-svc parser to treat a newline as end of line.

The unit tests in test 1654 were done without CRLF and thus didn't quite
match the real world. Now they use CRLF as well.

Reported-by: Peter Wu
Assisted-by: Peter Wu
Assisted-by: Jay Satiro
Fixes #5445
Closes #5446

lib/altsvc.c
tests/unit/unit1654.c

index f6c5c06126a0539b303a0fc68c2efacc0c588a2d..bb72a33a4fbf27921b6c58b39115080a5ceb9f4e 100644 (file)
@@ -431,6 +431,8 @@ static time_t debugtime(void *unused)
 #define time(x) debugtime(x)
 #endif
 
+#define ISNEWLINE(x) (((x) == '\n') || (x) == '\r')
+
 /*
  * Curl_altsvc_parse() takes an incoming alt-svc response header and stores
  * the data correctly in the cache.
@@ -520,12 +522,12 @@ CURLcode Curl_altsvc_parse(struct Curl_easy *data,
         /* Handle the optional 'ma' and 'persist' flags. Unknown flags
            are skipped. */
         for(;;) {
-          while(*p && ISBLANK(*p) && *p != ';' && *p != ',')
+          while(ISBLANK(*p))
             p++;
-          if(!*p || *p == ',')
+          if(*p != ';')
             break;
           p++; /* pass the semicolon */
-          if(!*p)
+          if(!*p || ISNEWLINE(*p))
             break;
           result = getalnum(&p, option, sizeof(option));
           if(result) {
index d05d0b214ceaa157a3f04969eeb4603e215eea75..e1475289d50ecfdb5c6d7cf2b80e7c22addee6fe 100644 (file)
@@ -63,7 +63,7 @@ UNITTEST_START
   fail_unless(asi->num == 4, "wrong number of entries");
   msnprintf(outname, sizeof(outname), "%s-out", arg);
 
-  result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:8080\"",
+  result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:8080\"\r\n",
                              ALPN_h1, "example.org", 8080);
   if(result) {
     fprintf(stderr, "Curl_altsvc_parse() failed!\n");
@@ -71,7 +71,7 @@ UNITTEST_START
   }
   fail_unless(asi->num == 5, "wrong number of entries");
 
-  result = Curl_altsvc_parse(curl, asi, "h3=\":8080\"",
+  result = Curl_altsvc_parse(curl, asi, "h3=\":8080\"\r\n",
                              ALPN_h1, "2.example.org", 8080);
   if(result) {
     fprintf(stderr, "Curl_altsvc_parse(2) failed!\n");
@@ -80,7 +80,7 @@ UNITTEST_START
   fail_unless(asi->num == 6, "wrong number of entries");
 
   result = Curl_altsvc_parse(curl, asi,
-                             "h2=\"example.com:8080\", h3=\"yesyes.com\"",
+                             "h2=\"example.com:8080\", h3=\"yesyes.com\"\r\n",
                              ALPN_h1, "3.example.org", 8080);
   if(result) {
     fprintf(stderr, "Curl_altsvc_parse(3) failed!\n");
@@ -89,7 +89,8 @@ UNITTEST_START
   /* that one should make two entries */
   fail_unless(asi->num == 8, "wrong number of entries");
 
-  result = Curl_altsvc_parse(curl, asi, "h2=\"example.com:443\"; ma = 120;",
+  result = Curl_altsvc_parse(curl, asi,
+                             "h2=\"example.com:443\"; ma = 120;\r\n",
                              ALPN_h2, "example.org", 80);
   if(result) {
     fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
@@ -98,7 +99,8 @@ UNITTEST_START
   fail_unless(asi->num == 9, "wrong number of entries");
 
   /* quoted 'ma' value */
-  result = Curl_altsvc_parse(curl, asi, "h2=\"example.net:443\"; ma=\"180\";",
+  result = Curl_altsvc_parse(curl, asi,
+                             "h2=\"example.net:443\"; ma=\"180\";\r\n",
                              ALPN_h2, "example.net", 80);
   if(result) {
     fprintf(stderr, "Curl_altsvc_parse(4) failed!\n");
@@ -106,9 +108,10 @@ UNITTEST_START
   }
   fail_unless(asi->num == 10, "wrong number of entries");
 
-  result = Curl_altsvc_parse(curl, asi,
-                             "h2=\":443\", h3=\":443\"; ma = 120; persist = 1",
-                             ALPN_h1, "curl.haxx.se", 80);
+  result =
+    Curl_altsvc_parse(curl, asi,
+                      "h2=\":443\", h3=\":443\"; ma = 120; persist = 1\r\n",
+                      ALPN_h1, "curl.haxx.se", 80);
   if(result) {
     fprintf(stderr, "Curl_altsvc_parse(5) failed!\n");
     unitfail++;
@@ -116,7 +119,7 @@ UNITTEST_START
   fail_unless(asi->num == 12, "wrong number of entries");
 
   /* clear that one again and decrease the counter */
-  result = Curl_altsvc_parse(curl, asi, "clear;",
+  result = Curl_altsvc_parse(curl, asi, "clear;\r\n",
                              ALPN_h1, "curl.haxx.se", 80);
   if(result) {
     fprintf(stderr, "Curl_altsvc_parse(6) failed!\n");