]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
quiche: reject headers in the wrong order
authorDaniel Stenberg <daniel@haxx.se>
Mon, 11 Nov 2019 08:56:23 +0000 (09:56 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 12 Nov 2019 08:44:24 +0000 (09:44 +0100)
Pseudo header MUST come before regular headers or cause an error.

Reported-by: Cynthia Coan
Fixes #4571
Closes #4584

docs/libcurl/symbols-in-versions
include/curl/curl.h
lib/strerror.c
lib/vquic/quiche.c
tests/data/test1538

index bf23b44880f19e093ca280e6a58caffd8a3ccbf3..c7dadea19b2d56c882ade5570cf429cde9f221b3 100644 (file)
@@ -84,6 +84,7 @@ CURLE_FUNCTION_NOT_FOUND        7.1
 CURLE_GOT_NOTHING               7.9.1
 CURLE_HTTP2                     7.38.0
 CURLE_HTTP2_STREAM              7.49.0
+CURLE_HTTP3                     7.68.0
 CURLE_HTTP_NOT_FOUND            7.1
 CURLE_HTTP_PORT_FAILED          7.3           7.12.0
 CURLE_HTTP_POST_ERROR           7.1
index dcbe8995cbc69a258f34b43d1a95a809b5970929..8c43fa884f20910f4ca08c50e80ad1df130b9268 100644 (file)
@@ -501,7 +501,9 @@ typedef enum {
   CURLE_FTP_COULDNT_SET_TYPE,    /* 17 */
   CURLE_PARTIAL_FILE,            /* 18 */
   CURLE_FTP_COULDNT_RETR_FILE,   /* 19 */
-  CURLE_OBSOLETE20,              /* 20 - NOT USED */
+  CURLE_HTTP3,                   /* 20 - An HTTP/3 layer problem.
+                                    [was obsoleted in August 2007 for 7.17.0,
+                                    reused in November 2019 for 7.67.1] */
   CURLE_QUOTE_ERROR,             /* 21 - quote command failure */
   CURLE_HTTP_RETURNED_ERROR,     /* 22 */
   CURLE_WRITE_ERROR,             /* 23 */
index 7aaa9f4a79903e1e15d09b1472e2cd4d09ebb6fd..90e8a3131acede7afe2ba0976504e948f4f306de 100644 (file)
@@ -314,8 +314,10 @@ curl_easy_strerror(CURLcode error)
   case CURLE_AUTH_ERROR:
     return "An authentication function returned an error";
 
+  case CURLE_HTTP3:
+    return "HTTP/3 error";
+
     /* error codes not used by current libcurl */
-  case CURLE_OBSOLETE20:
   case CURLE_OBSOLETE24:
   case CURLE_OBSOLETE29:
   case CURLE_OBSOLETE32:
index 0ee360d07fc4c6bf4f34b6584df54411192f3854..6f9a72579c85d444b171db4b96f814a9d30c5c90 100644 (file)
@@ -379,6 +379,9 @@ static int cb_each_header(uint8_t *name, size_t name_len,
               headers->destlen, "HTTP/3 %.*s\n",
               (int) value_len, value);
   }
+  else if(!headers->nlen) {
+    return CURLE_HTTP3;
+  }
   else {
     msnprintf(headers->dest,
               headers->destlen, "%.*s: %.*s\n",
@@ -433,7 +436,9 @@ static ssize_t h3_stream_recv(struct connectdata *conn,
     case QUICHE_H3_EVENT_HEADERS:
       rc = quiche_h3_event_for_each_header(ev, cb_each_header, &headers);
       if(rc) {
-        /* what do we do about this? */
+        *curlcode = rc;
+        failf(data, "Error in HTTP/3 response header");
+        break;
       }
       recvd = headers.nlen;
       break;
index 9374debb75f29263b42f19bbf2201a1d85153cab..d59671d2acb8f473e57fe8fa0f26d9fdecfd29fc 100644 (file)
@@ -52,7 +52,7 @@ e16: Error in the HTTP2 framing layer
 e17: FTP: couldn't set file type
 e18: Transferred a partial file
 e19: FTP: couldn't retrieve (RETR failed) the specified file
-e20: Unknown error
+e20: HTTP/3 error
 e21: Quote command returned error
 e22: HTTP response code said error
 e23: Failed writing received data to disk/application