[prev in list] [next in list] [prev in thread] [next in thread] 

List:       varnish-commit
Subject:    [master] 0c3acbd If we get an illegal og bogus Vary: header from the backend, turn the transaction i
From:       Poul-Henning Kamp <phk () varnish-cache ! org>
Date:       2013-07-04 9:23:47
Message-ID: E1UuflT-0002Oz-Ta () project ! varnish-software ! com
[Download RAW message or body]

commit 0c3acbd699bc67ca5a3e98648f7f92ef93e34378
Author: Poul-Henning Kamp <phk@FreeBSD.org>
Date:   Thu Jul 4 09:22:50 2013 +0000

    If we get an illegal og bogus Vary: header from the backend,
    turn the transaction into a "pass" and complain in VSL.
    
    Previously we faulted the fetch, but that was overly draconian.

diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 3488954..b55096a 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -232,8 +232,6 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
 	CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
 
 	assert(wrk->handling == VCL_RET_DELIVER);
-	if (bo->uncacheable)
-		bo->fetch_objcore->flags |= OC_F_PASS;
 
 	/*
 	 * The VCL variables beresp.do_g[un]zip tells us how we want the
@@ -307,17 +305,23 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
 			assert(varyl == VSB_len(vary));
 			l += varyl;
 		} else if (varyl < 0) {
-			/* Vary parse error */
+			/*
+			 * Vary parse error
+			 * Complain about it, and make this a pass.
+			 */
+			VSLb(bo->vsl, SLT_Error,
+			    "Illegal 'Vary' header from backend, "
+			    "making this a pass.");
+			bo->uncacheable = 1;
 			AZ(vary);
-			AZ(HSH_Deref(&wrk->stats, bo->fetch_objcore, NULL));
-			bo->fetch_objcore = NULL;
-			VDI_CloseFd(&bo->vbc);
-			return (F_STP_ABANDON);
 		} else
 			/* No vary */
 			AZ(vary);
 	}
 
+	if (bo->uncacheable)
+		bo->fetch_objcore->flags |= OC_F_PASS;
+
 	if (bo->exp.ttl < cache_param->shortlived || bo->uncacheable == 1)
 		bo->storage_hint = TRANSIENT_STORAGE;
 
diff --git a/bin/varnishd/flint.lnt b/bin/varnishd/flint.lnt
index f12f128..5402e1f 100644
--- a/bin/varnishd/flint.lnt
+++ b/bin/varnishd/flint.lnt
@@ -169,3 +169,5 @@
 -e747	// 297 Significant prototype coercion (___) ___ to ___
 -e840	// Use of nul character in a string literal (see: vcc_if.c)
 -e663	// Suspicious array to pointer conversion
+-e778   // Constant expression evaluates to 0 in operation '___'
+
diff --git a/bin/varnishtest/tests/r00763.vtc b/bin/varnishtest/tests/r00763.vtc
index 72fced4..bd6f80e 100644
--- a/bin/varnishtest/tests/r00763.vtc
+++ b/bin/varnishtest/tests/r00763.vtc
@@ -3,6 +3,8 @@ varnishtest "Vary header with extra colon"
 server s1 {
 	rxreq
 	txresp -hdr "Vary:: foo" -hdr "Foo: bar" -bodylen 9
+	rxreq
+	txresp -hdr "Vary:: foo" -hdr "Foo: bar" -bodylen 8
 } -start
 
 varnish v1 -vcl+backend {} -start
@@ -10,5 +12,10 @@ varnish v1 -vcl+backend {} -start
 client c1 {
 	txreq
 	rxresp
-	expect resp.status == 503
+	expect resp.status == 200
+	expect resp.bodylen == 9
+	txreq
+	rxresp
+	expect resp.status == 200
+	expect resp.bodylen == 8
 } -run
diff --git a/bin/varnishtest/tests/r01274.vtc b/bin/varnishtest/tests/r01274.vtc
index fe427cc..90cd95d 100644
--- a/bin/varnishtest/tests/r01274.vtc
+++ b/bin/varnishtest/tests/r01274.vtc
@@ -3,7 +3,10 @@ varnishtest "#1274 - panic when Vary field-name is too large to fit \
in a signed  server s1 {
        rxreq
        # Vary header more than 127 characters long
-       txresp -hdr "Vary: \
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
 +       txresp -hdr "Vary: \
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
-bodylen 9 +       rxreq
+       # Vary header more than 127 characters long
+       txresp -hdr "Vary: \
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
-bodylen 8  } -start
 
 varnish v1 -vcl+backend { } -start
@@ -11,5 +14,10 @@ varnish v1 -vcl+backend { } -start
 client c1 {
        txreq
        rxresp
-       expect resp.status == 503
+       expect resp.status == 200
+       expect resp.bodylen == 9
+       txreq
+       rxresp
+       expect resp.status == 200
+       expect resp.bodylen == 8
 } -run
diff --git a/bin/varnishtest/tests/r01275.vtc b/bin/varnishtest/tests/r01275.vtc
index 72c7184..913bb0e 100644
--- a/bin/varnishtest/tests/r01275.vtc
+++ b/bin/varnishtest/tests/r01275.vtc
@@ -10,5 +10,5 @@ varnish v1 -vcl+backend { } -start
 client c1 {
        txreq
        rxresp
-       expect resp.status == 503
+       expect resp.status == 200
 } -run

_______________________________________________
varnish-commit mailing list
varnish-commit@varnish-cache.org
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-commit


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic