[4.1] ea2d74c Don't reset the oc->ban pointer from BAN_CheckObject

Martin Blix Grydeland martin at varnish-software.com
Thu Mar 3 10:52:53 CET 2016


commit ea2d74c4ac20a2182ad8e717076ad912fe2b5994
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Wed Mar 2 14:59:09 2016 +0100

    Don't reset the oc->ban pointer from BAN_CheckObject
    
    Resetting the pointer would race against the ban lurker moving the OC
    in the ban list and any object event listeners wanting to see the new
    ban timestamp on OEV_BANCHG.
    
    Fixes: #1863

diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c
index bb06490..cfb8da0 100644
--- a/bin/varnishd/cache/cache_ban.c
+++ b/bin/varnishd/cache/cache_ban.c
@@ -554,16 +554,14 @@ BAN_CheckObject(struct worker *wrk, struct objcore *oc, struct req *req)
 	VSC_C_main->bans_tested++;
 	VSC_C_main->bans_tests_tested += tests;
 
-	oc->ban->refcount--;
-	VTAILQ_REMOVE(&oc->ban->objcore, oc, ban_list);
 	if (b == bn) {
 		/* not banned */
+		oc->ban->refcount--;
+		VTAILQ_REMOVE(&oc->ban->objcore, oc, ban_list);
 		VTAILQ_INSERT_TAIL(&b0->objcore, oc, ban_list);
 		b0->refcount++;
 		oc->ban = b0;
 		b = NULL;
-	} else {
-		oc->ban = NULL;
 	}
 
 	if (VTAILQ_LAST(&ban_head, banhead_s)->refcount == 0)



More information about the varnish-commit mailing list