[4.1] 1ec38ef Close a race in the round robin director - for real now

PÃ¥l Hermunn Johansen hermunn at varnish-software.com
Tue Sep 19 13:33:05 UTC 2017


commit 1ec38efb6fc2c156b50869fd548f2dbdcee709dc
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Fri Jul 28 22:01:26 2017 +0200

    Close a race in the round robin director - for real now
    
    The previous code allowed the compiler to re-read nxt from
    rr->nxt which could have been incremented cocurrently.
    
    Fixes #2378

diff --git a/lib/libvmod_directors/round_robin.c b/lib/libvmod_directors/round_robin.c
index c6c9c9b..6ebf7a3 100644
--- a/lib/libvmod_directors/round_robin.c
+++ b/lib/libvmod_directors/round_robin.c
@@ -70,9 +70,9 @@ vmod_rr_resolve(const struct director *dir, struct worker *wrk,
 	CAST_OBJ_NOTNULL(rr, dir->priv, VMOD_DIRECTORS_ROUND_ROBIN_MAGIC);
 	vdir_rdlock(rr->vd);
 	for (u = 0; u < rr->vd->n_backend; u++) {
-		nxt = rr->nxt %= rr->vd->n_backend;
+		nxt = rr->nxt % rr->vd->n_backend;
+		rr->nxt = nxt + 1;
 		be = rr->vd->backend[nxt];
-		rr->nxt++;
 		CHECK_OBJ_NOTNULL(be, DIRECTOR_MAGIC);
 		if (be->healthy(be, bo, NULL))
 			break;


More information about the varnish-commit mailing list