[PATCH] Make http_PutProtocol() and http_PutResponse() never fail, and increase make the synthetic object's workspace be param->http_resp_size

Poul-Henning Kamp phk at phk.freebsd.dk
Fri Oct 14 11:13:24 CEST 2011


Works for me:  Commit it.

In message <1318541712-25077-2-git-send-email-martin at varnish-software.com>, Mar
tin Blix Grydeland writes:
>The http_PutProtocol() and http_PutResponse() would in the case of
>workspace overflow leave the headers as NULL and log a
>SLT_LostHeader. This would make Varnish assert correctly later when
>writing to the wire, as these are mandated by HTTP. This patch changes
>them to set the fields to static strings instead ("HTTP/1.1" and "Lost
>Response") when failing to write them to the workspace. This leaves
>enough information to complete the protocol in the case of overflow.
>
>The patch also increases the synthetic object's workspace from static
>1024 to param->http_resp_size. This leaves more (and configurable)
>room for manipulating the headers of the synthetic object in
>vcl_error.
>
>Test case by Kristian
>
>Fixes: #1031
>---
> bin/varnishd/cache_center.c      |    8 ++++----
> bin/varnishd/cache_http.c        |    6 ++++++
> bin/varnishtest/tests/r01031.vtc |   30 ++++++++++++++++++++++++++++++
> 3 files changed, 40 insertions(+), 4 deletions(-)
> create mode 100644 bin/varnishtest/tests/r01031.vtc
>
>diff --git a/bin/varnishd/cache_center.c b/bin/varnishd/cache_center.c
>index 39a2104..4d94d88 100644
>--- a/bin/varnishd/cache_center.c
>+++ b/bin/varnishd/cache_center.c
>@@ -436,13 +436,13 @@ cnt_error(struct sess *sp)
> 	w = sp->wrk;
> 	if (sp->obj == NULL) {
> 		HSH_Prealloc(sp);
>-		/* XXX: 1024 is a pure guess */
> 		EXP_Clr(&w->exp);
>-		sp->obj = STV_NewObject(sp, NULL, 1024, &w->exp,
>-		     (uint16_t)params->http_max_hdr);
>+		sp->obj = STV_NewObject(sp, NULL, params->http_resp_size,
>+		     &w->exp, (uint16_t)params->http_max_hdr);
> 		if (sp->obj == NULL)
> 			sp->obj = STV_NewObject(sp, TRANSIENT_STORAGE,
>-			    1024, &w->exp, (uint16_t)params->http_max_hdr);
>+			     params->http_resp_size , &w->exp,
>+			     (uint16_t)params->http_max_hdr);
> 		if (sp->obj == NULL) {
> 			sp->doclose = "Out of objects";
> 			sp->director = NULL;
>diff --git a/bin/varnishd/cache_http.c b/bin/varnishd/cache_http.c
>index f77ab74..5ce1b6a 100644
>--- a/bin/varnishd/cache_http.c
>+++ b/bin/varnishd/cache_http.c
>@@ -981,6 +981,9 @@ http_PutProtocol(struct worker *w, int fd, const struct http *to,
> {
> 
> 	http_PutField(w, fd, to, HTTP_HDR_PROTO, protocol);
>+	if (to->hd[HTTP_HDR_PROTO].b == NULL)
>+		http_SetH(to, HTTP_HDR_PROTO, "HTTP/1.1");
>+	Tcheck(to->hd[HTTP_HDR_PROTO]);
> }
> 
> void
>@@ -997,6 +1000,9 @@ http_PutResponse(struct worker *w, int fd, const struct http *to,
> {
> 
> 	http_PutField(w, fd, to, HTTP_HDR_RESPONSE, response);
>+	if (to->hd[HTTP_HDR_RESPONSE].b == NULL)
>+		http_SetH(to, HTTP_HDR_RESPONSE, "Lost Response");
>+	Tcheck(to->hd[HTTP_HDR_RESPONSE]);
> }
> 
> void
>diff --git a/bin/varnishtest/tests/r01031.vtc b/bin/varnishtest/tests/r01031.vtc
>new file mode 100644
>index 0000000..435f973
>--- /dev/null
>+++ b/bin/varnishtest/tests/r01031.vtc
>@@ -0,0 +1,30 @@
>+varnishtest "Test overflowing the response through sp->err_reason"
>+
>+varnish v1 -vcl {
>+	backend blatti {
>+		.host = "127.0.0.1";
>+	}
>+
>+	sub vcl_recv {
>+		error 200 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
>+	}
>+	sub vcl_error {
>+		return(deliver);
>+	}
>+} -start
>+
>+client c1 {
>+	txreq -req GET
>+	rxresp
>+	expect resp.status == 200
>+	expect resp.msg == "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
>+} -run
>+
>+varnish v1 -cliok "param.set http_resp_size 256"
>+
>+client c2 {
>+	txreq -req GET
>+	rxresp
>+	expect resp.status == 200
>+	expect resp.msg == "Lost Response"
>+} -run
>-- 
>1.7.4.1
>
>
>_______________________________________________
>varnish-dev mailing list
>varnish-dev at varnish-cache.org
>https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev
>

-- 
Poul-Henning Kamp       | UNIX since Zilog Zeus 3.20
phk at FreeBSD.ORG         | TCP/IP since RFC 956
FreeBSD committer       | BSD since 4.3-tahoe    
Never attribute to malice what can adequately be explained by incompetence.




More information about the varnish-dev mailing list