[master] 55753f98b Centralize check for multiple Host: and Content-Length headers. Increment client_req_400 in more cases.

Poul-Henning Kamp phk at FreeBSD.org
Tue Oct 12 12:15:07 UTC 2021


commit 55753f98b1b392766bd4baed7eb684c006225f57
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Oct 12 11:26:58 2021 +0000

    Centralize check for multiple Host: and Content-Length headers.
    Increment client_req_400 in more cases.

diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 5116c8c4c..e754014e7 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -110,6 +110,7 @@ cnt_transport(struct worker *wrk, struct req *req)
 
 	req->doclose = http_DoConnection(req->http, SC_REQ_CLOSE);
 	if (req->doclose == SC_RX_BAD) {
+		wrk->stats->client_req_400++;
 		(void)req->transport->minimal_response(req, 400);
 		return (REQ_FSM_DONE);
 	}
@@ -927,6 +928,20 @@ cnt_recv(struct worker *wrk, struct req *req)
 
 	http_VSL_log(req->http);
 
+	if (http_CountHdr(req->http0, H_Host) > 1) {
+		VSLb(req->vsl, SLT_BogoHeader, "Multiple Host: headers");
+		wrk->stats->client_req_400++;
+		(void)req->transport->minimal_response(req, 400);
+		return (REQ_FSM_DONE);
+	}
+
+	if (http_CountHdr(req->http0, H_Content_Length) > 1) {
+		VSLb(req->vsl, SLT_BogoHeader, "Multiple Content-Length: headers");
+		wrk->stats->client_req_400++;
+		(void)req->transport->minimal_response(req, 400);
+		return (REQ_FSM_DONE);
+	}
+
 	cnt_recv_prep(req, ci);
 
 	if (req->req_body_status == BS_ERROR) {
diff --git a/bin/varnishd/http1/cache_http1_proto.c b/bin/varnishd/http1/cache_http1_proto.c
index eb19825cc..f56a29b52 100644
--- a/bin/varnishd/http1/cache_http1_proto.c
+++ b/bin/varnishd/http1/cache_http1_proto.c
@@ -368,12 +368,6 @@ HTTP1_DissectRequest(struct http_conn *htc, struct http *hp)
 	if (hp->protover < 10 || hp->protover > 11)
 		return (400);
 
-	if (http_CountHdr(hp, H_Host) > 1)
-		return (400);
-
-	if (http_CountHdr(hp, H_Content_Length) > 1)
-		return (400);
-
 	/* RFC2616, section 5.2, point 1 */
 	if (http_scheme_at(hp->hd[HTTP_HDR_URL].b, http))
 		b = hp->hd[HTTP_HDR_URL].b + 7;
diff --git a/bin/varnishtest/tests/b00037.vtc b/bin/varnishtest/tests/b00037.vtc
index 1b7c31235..74fad6118 100644
--- a/bin/varnishtest/tests/b00037.vtc
+++ b/bin/varnishtest/tests/b00037.vtc
@@ -8,6 +8,7 @@ client c1 {
 	expect resp.status == 400
 } -run
 
+varnish v1 -vsl_catchup
 varnish v1 -expect client_req_400 == 1
 
 client c1 {
@@ -16,4 +17,28 @@ client c1 {
 	expect resp.status == 400
 } -run
 
+varnish v1 -vsl_catchup
 varnish v1 -expect client_req_400 == 2
+
+varnish v1 -cliok "param.set feature +http2"
+
+client c2 {
+	stream 7 {
+		txreq -hdr host foo -hdr host bar
+		rxresp
+		expect resp.status == 400
+	} -run
+} -run
+
+varnish v1 -vsl_catchup
+varnish v1 -expect client_req_400 == 3
+
+client c3 {
+	stream 3 {
+		txreq -req POST -hdr content-length 12 -hdr content-length 13 -body request
+		rxrst
+	} -run
+} -run
+
+varnish v1 -vsl_catchup
+varnish v1 -expect client_req_400 == 4


More information about the varnish-commit mailing list