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

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