Blame SOURCES/squid-4.11-CVE-2020-15810.patch

08f08e
diff --git a/src/HttpHeader.cc b/src/HttpHeader.cc
08f08e
index 67543a4..19efc6d 100644
08f08e
--- a/src/HttpHeader.cc
08f08e
+++ b/src/HttpHeader.cc
08f08e
@@ -445,18 +445,6 @@ HttpHeader::parse(const char *header_start, size_t hdrLen)
08f08e
             return 0;
08f08e
         }
08f08e
 
08f08e
-        if (e->id == Http::HdrType::OTHER && stringHasWhitespace(e->name.termedBuf())) {
08f08e
-            debugs(55, warnOnError, "WARNING: found whitespace in HTTP header name {" <<
08f08e
-                   getStringPrefix(field_start, field_end-field_start) << "}");
08f08e
-
08f08e
-            if (!Config.onoff.relaxed_header_parser) {
08f08e
-                delete e;
08f08e
-                PROF_stop(HttpHeaderParse);
08f08e
-                clean();
08f08e
-                return 0;
08f08e
-            }
08f08e
-        }
08f08e
-
08f08e
         addEntry(e);
08f08e
     }
08f08e
 
08f08e
@@ -1451,6 +1439,20 @@ HttpHeaderEntry::parse(const char *field_start, const char *field_end, const htt
08f08e
         }
08f08e
     }
08f08e
 
08f08e
+    /* RFC 7230 section 3.2:
08f08e
+     *
08f08e
+     *  header-field   = field-name ":" OWS field-value OWS
08f08e
+     *  field-name     = token
08f08e
+     *  token          = 1*TCHAR
08f08e
+     */
08f08e
+    for (const char *pos = field_start; pos < (field_start+name_len); ++pos) {
08f08e
+        if (!CharacterSet::TCHAR[*pos]) {
08f08e
+            debugs(55, 2, "found header with invalid characters in " <<
08f08e
+                   Raw("field-name", field_start, min(name_len,100)) << "...");
08f08e
+            return nullptr;
08f08e
+        }
08f08e
+    }
08f08e
+
08f08e
     /* now we know we can parse it */
08f08e
 
08f08e
     debugs(55, 9, "parsing HttpHeaderEntry: near '" <<  getStringPrefix(field_start, field_end-field_start) << "'");