Fixes: #1672
---
 bin/varnishd/cache/cache_fetch.c |  4 +++-
 bin/varnishtest/tests/r01672.vtc | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 bin/varnishtest/tests/r01672.vtc

diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 07801e8..79e2c3b 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -393,7 +393,9 @@ vbf_stp_startfetch(struct worker *wrk, struct busyobj *bo)
 
        AZ(bo->do_esi);
 
-       if (bo->ims_oc != NULL && http_IsStatus(bo->beresp, 304)) {
+       if (bo->ims_oc != NULL &&
+           ObjCheckFlag(bo->wrk, bo->ims_oc, OF_IMSCAND) &&
+           http_IsStatus(bo->beresp, 304)) {
                if (ObjCheckFlag(bo->wrk, bo->ims_oc, OF_CHGGZIP)) {
                        /*
                         * If we changed the gzip status of the object
diff --git a/bin/varnishtest/tests/r01672.vtc b/bin/varnishtest/tests/r01672.vtc
new file mode 100644
index 0000000..ae99a2f
--- /dev/null
+++ b/bin/varnishtest/tests/r01672.vtc
@@ -0,0 +1,33 @@
+varnishtest "#1672: Bogus 304 backend reply"
+
+# First serve a non-200 status object to the cache,
+# then revalidate it unconditionally
+server s1 {
+       rxreq
+       txresp -status 404
+
+       rxreq
+       txresp -status 304
+} -start
+
+varnish v1 -vcl+backend {
+       sub vcl_backend_response {
+               set beresp.ttl = 0.1s;
+               set beresp.grace = 0s;
+               set beresp.keep = 10s;
+       }
+} -start
+
+client c1 {
+       txreq
+       rxresp
+       expect resp.status == 404
+} -run
+
+delay 0.2
+
+client c1 {
+       txreq
+       rxresp
+       expect resp.status == 304
+} -run
-- 
2.1.4


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

Reply via email to