---

 bin/varnishd/cache/cache.h             |    1 +
 bin/varnishd/cache/cache_http.c        |    2 +-
 bin/varnishd/cache/cache_http1_proto.c |   29 +++++++++++++++++++++++++++++
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 865b315..8763669 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -877,6 +877,7 @@ double http_GetHdrQ(const struct http *hp, const char *hdr, 
const char *field);
 uint16_t http_GetStatus(const struct http *hp);
 const char *http_GetReq(const struct http *hp);
 int http_HdrIs(const struct http *hp, const char *hdr, const char *val);
+int http_IsHdr(const txt *hh, const char *hdr);
 enum sess_close http_DoConnection(const struct http *);
 void http_CopyHome(const struct http *hp);
 void http_Unset(struct http *hp, const char *hdr);
diff --git a/bin/varnishd/cache/cache_http.c b/bin/varnishd/cache/cache_http.c
index e9f9e22..1eb429a 100644
--- a/bin/varnishd/cache/cache_http.c
+++ b/bin/varnishd/cache/cache_http.c
@@ -154,7 +154,7 @@ http_Teardown(struct http *hp)
 
 /*--------------------------------------------------------------------*/
 
-static int
+int
 http_IsHdr(const txt *hh, const char *hdr)
 {
        unsigned l;
diff --git a/bin/varnishd/cache/cache_http1_proto.c 
b/bin/varnishd/cache/cache_http1_proto.c
index 00ed9bf..6be14d1 100644
--- a/bin/varnishd/cache/cache_http1_proto.c
+++ b/bin/varnishd/cache/cache_http1_proto.c
@@ -376,6 +376,30 @@ htc_splitline(struct http *hp, const struct http_conn 
*htc, int req)
 
 /*--------------------------------------------------------------------*/
 
+static int
+htc_request_invalid(struct http *hp)
+{
+       int u;
+       int seen_host = 0;
+       for (u = HTTP_HDR_FIRST; u < hp->nhd; u++) {
+               if (hp->hd[u].b == NULL)
+                       continue;
+               AN(hp->hd[u].b);
+               AN(hp->hd[u].e);
+               if (http_IsHdr(&hp->hd[u], H_Host)) {
+                       if (seen_host) {
+                               VSLb(hp->vsl, SLT_Error, "Duplicated Host 
header");
+                               return (400);
+                       }
+                       seen_host = 1;
+               }
+       }
+       return (0);
+}
+
+
+/*--------------------------------------------------------------------*/
+
 static void
 htc_proto_ver(struct http *hp)
 {
@@ -412,6 +436,11 @@ HTTP1_DissectRequest(struct req *req)
        }
        htc_proto_ver(hp);
 
+       retval = htc_request_invalid(hp);
+       if (retval != 0) {
+               return (retval);
+       }
+
        /* RFC2616, section 5.2, point 1 */
        if (!strncasecmp(hp->hd[HTTP_HDR_URL].b, "http://";, 7)) {
                b = e = hp->hd[HTTP_HDR_URL].b + 7;
-- 
1.7.10.4


_______________________________________________
varnish-dev mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

Reply via email to