[master] d50db26 Close a race between backend probe and vcl.state=Cold by removing the be->vsc under backend mtx.

Poul-Henning Kamp phk at FreeBSD.org
Mon Nov 27 12:30:13 UTC 2017


commit d50db264c16c342758f13e9a1940110eb89e227f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Mon Nov 27 11:54:31 2017 +0000

    Close a race between backend probe and vcl.state=Cold by removing
    the be->vsc under backend mtx.
    
    Fixes #2505

diff --git a/bin/varnishd/cache/cache_backend.c b/bin/varnishd/cache/cache_backend.c
index 48075d9..d05cb80 100644
--- a/bin/varnishd/cache/cache_backend.c
+++ b/bin/varnishd/cache/cache_backend.c
@@ -335,6 +335,7 @@ static void
 vbe_dir_event(const struct director *d, enum vcl_event_e ev)
 {
 	struct backend *bp;
+	struct VSC_vbe *vsc;
 
 	CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC);
 	CAST_OBJ_NOTNULL(bp, d->priv, BACKEND_MAGIC);
@@ -353,7 +354,11 @@ vbe_dir_event(const struct director *d, enum vcl_event_e ev)
 
 	if (ev == VCL_EVENT_COLD) {
 		AN(bp->vsc);
-		VSC_vbe_Destroy(&bp->vsc);
+		Lck_Lock(&backends_mtx);
+		vsc = bp->vsc;
+		bp->vsc = NULL;
+		Lck_Unlock(&backends_mtx);
+		VSC_vbe_Destroy(&vsc);
 		AZ(bp->vsc);
 	}
 }
@@ -524,6 +529,7 @@ void
 VBE_SetHappy(const struct backend *be, uint64_t happy)
 {
 
+	CHECK_OBJ_NOTNULL(be, BACKEND_MAGIC);
 	Lck_Lock(&backends_mtx);
 	if (be->vsc != NULL)
 		be->vsc->happy = happy;
diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index afb4ea0..e042a61 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -997,8 +997,10 @@ vcl_cli_discard(struct cli *cli, const char * const *av, void *priv)
 		free(vcl->loaded_name);
 		AZ(errno=pthread_rwlock_destroy(&vcl->temp_rwl));
 		FREE_OBJ(vcl);
-	} else if (vcl->temp == VCL_TEMP_COLD)
+	} else {
+		assert(vcl->temp == VCL_TEMP_COLD);
 		VCL_Poll();
+	}
 }
 
 static void __match_proto__(cli_func_t)


More information about the varnish-commit mailing list