[5.1] c737577 Straighten out the HPACK error path.

Poul-Henning Kamp phk at FreeBSD.org
Mon Apr 10 13:59:07 CEST 2017


commit c73757749d29af793f470c97d2846629256448a3
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Mar 29 18:55:42 2017 +0000

    Straighten out the HPACK error path.
    
    Fixes #2289

diff --git a/bin/varnishd/http2/cache_http2_hpack.c b/bin/varnishd/http2/cache_http2_hpack.c
index 4b0a1ce..9bcc1dd 100644
--- a/bin/varnishd/http2/cache_http2_hpack.c
+++ b/bin/varnishd/http2/cache_http2_hpack.c
@@ -49,7 +49,7 @@ h2h_checkhdr(const struct http *hp, const char *b, size_t namelen, size_t len)
 
 	if (namelen == 2) {
 		VSLb(hp->vsl, SLT_BogoHeader, "Empty name");
-		return (H2CE_PROTOCOL_ERROR);
+		return (H2SE_PROTOCOL_ERROR);
 	}
 
 	for (p = b; p < b + len; p++) {
@@ -61,7 +61,7 @@ h2h_checkhdr(const struct http *hp, const char *b, size_t namelen, size_t len)
 				VSLb(hp->vsl, SLT_BogoHeader,
 				    "Illegal header name (upper-case): %.*s",
 				    (int)(len > 20 ? 20 : len), b);
-				return (H2CE_PROTOCOL_ERROR);
+				return (H2SE_PROTOCOL_ERROR);
 			}
 			if (vct_istchar(*p)) {
 				/* XXX: vct should have a proper class for
@@ -71,7 +71,7 @@ h2h_checkhdr(const struct http *hp, const char *b, size_t namelen, size_t len)
 			VSLb(hp->vsl, SLT_BogoHeader,
 			    "Illegal header name: %.*s",
 			    (int)(len > 20 ? 20 : len), b);
-			return (H2CE_PROTOCOL_ERROR);
+			return (H2SE_PROTOCOL_ERROR);
 		} else if (p < b + namelen) {
 			/* ': ' added by us */
 			assert(*p == ':' || *p == ' ');
@@ -82,7 +82,7 @@ h2h_checkhdr(const struct http *hp, const char *b, size_t namelen, size_t len)
 			VSLb(hp->vsl, SLT_BogoHeader,
 			    "Illegal header value: %.*s",
 			    (int)(len > 20 ? 20 : len), b);
-			return (H2CE_PROTOCOL_ERROR);
+			return (H2SE_PROTOCOL_ERROR);
 		}
 	}
 
@@ -134,7 +134,7 @@ h2h_addhdr(struct http *hp, char *b, size_t namelen, size_t len)
 			VSLb(hp->vsl, SLT_BogoHeader,
 			    "Unknown pseudo-header: %.*s",
 			    (int)(len > 20 ? 20 : len), b);
-			return (H2SE_PROTOCOL_ERROR);
+			return (H2SE_PROTOCOL_ERROR);	// rfc7540,l,2990,2992
 		}
 	} else
 		n = hp->nhd;
@@ -145,7 +145,7 @@ h2h_addhdr(struct http *hp, char *b, size_t namelen, size_t len)
 			VSLb(hp->vsl, SLT_BogoHeader,
 			    "Duplicate pseudo-header: %.*s",
 			    (int)(len > 20 ? 20 : len), b);
-			return (H2SE_PROTOCOL_ERROR);
+			return (H2SE_PROTOCOL_ERROR);	// rfc7540,l,3158,3162
 		}
 	} else {
 		/* Check for space in struct http */
diff --git a/bin/varnishd/http2/cache_http2_proto.c b/bin/varnishd/http2/cache_http2_proto.c
index 1a85b1e..5e34543 100644
--- a/bin/varnishd/http2/cache_http2_proto.c
+++ b/bin/varnishd/http2/cache_http2_proto.c
@@ -469,7 +469,6 @@ h2_do_req(struct worker *wrk, void *priv)
 	THR_SetRequest(req);
 	req->http->conds = 1;
 	if (CNT_Request(wrk, req) != REQ_FSM_DISEMBARK) {
-		VSL(SLT_Debug, 0, "H2REQ CNT done");
 		AZ(req->ws->r);
 		r2->scheduled = 0;
 		r2->state = H2_S_CLOSED;
@@ -491,7 +490,7 @@ h2_end_headers(struct worker *wrk, const struct h2_sess *h2,
 	FREE_OBJ(r2->decode);
 	r2->state = H2_S_CLOS_REM;
 	if (h2e != NULL) {
-		VSL(SLT_Debug, 0, "H2H_DECODE_FINI %s", h2e->name);
+		VSLb(h2->vsl, SLT_Debug, "HPACK/FINI %s", h2e->name);
 		AZ(r2->req->ws->r);
 		h2_del_req(wrk, r2);
 		return (h2e);
@@ -558,12 +557,12 @@ h2_rx_headers(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
 		p += 1;
 	}
 	if (h2->rxf_flags & H2FF_HEADERS_PRIORITY) {
-		p += 5;
 		l -= 5;
+		p += 5;
 	}
 	h2e = h2h_decode_bytes(h2, r2->decode, p, l);
 	if (h2e != NULL) {
-		VSL(SLT_Debug, 0, "H2H_DECODE_BYTES(hdr) %s", h2e->name);
+		VSLb(h2->vsl, SLT_Debug, "HPACK(hdr) %s", h2e->name);
 		(void)h2h_decode_fini(h2, r2->decode);
 		AZ(r2->req->ws->r);
 		h2_del_req(wrk, r2);
@@ -590,7 +589,7 @@ h2_rx_continuation(struct worker *wrk, struct h2_sess *h2, struct h2_req *r2)
 	req = r2->req;
 	h2e = h2h_decode_bytes(h2, r2->decode, h2->rxf_data, h2->rxf_len);
 	if (h2e != NULL) {
-		VSL(SLT_Debug, 0, "H2H_DECODE_BYTES(cont) %s", h2e->name);
+		VSLb(h2->vsl, SLT_Debug, "HPACK(cont) %s", h2e->name);
 		(void)h2h_decode_fini(h2, r2->decode);
 		AZ(r2->req->ws->r);
 		h2_del_req(wrk, r2);
@@ -733,7 +732,6 @@ h2_frame_complete(struct http_conn *htc)
 	if (l < 9)
 		return (HTC_S_MORE);
 	u = vbe32dec(htc->rxbuf_b) >> 8;
-	VSL(SLT_Debug, 0, "RX %p %d %u", htc->rxbuf_b, l, u);
 	if (l < u + 9)	// XXX: Only for !DATA frames
 		return (HTC_S_MORE);
 	return (HTC_S_COMPLETE);
@@ -792,12 +790,11 @@ h2_procframe(struct worker *wrk, struct h2_sess *h2,
 	VSLb(h2->vsl, SLT_Debug, "H2: stream %u: %s", h2->rxf_stream, h2e->txt);
 	vbe32enc(b, h2e->val);
 
-	H2_Send_Get(wrk, h2, r2);
+	H2_Send_Get(wrk, h2, h2->req0);
 	(void)H2_Send_Frame(wrk, h2, H2_F_RST_STREAM,
 	    0, sizeof b, h2->rxf_stream, b);
-	H2_Send_Rel(h2, r2);
+	H2_Send_Rel(h2, h2->req0);
 
-	h2_del_req(wrk, r2);
 	return (0);
 }
 
diff --git a/bin/varnishtest/tests/t02003.vtc b/bin/varnishtest/tests/t02003.vtc
index b2e964f..eef69e2 100644
--- a/bin/varnishtest/tests/t02003.vtc
+++ b/bin/varnishtest/tests/t02003.vtc
@@ -349,6 +349,14 @@ client c1 {
 	} -run
 } -run
 
+client c1 {
+	stream 1 {
+		txreq -hdr ":bla" "foo"
+		rxrst
+		expect rst.err == PROTOCOL_ERROR
+	} -run
+} -run
+
 varnish v1 -vsl_catchup
 
 varnish v1 -expect MEMPOOL.req0.live == 0



More information about the varnish-commit mailing list