[master] 5d04b20 This is sort of embarrasing: I forgot to lock the busyobj when changing the storage list.

Poul-Henning Kamp phk at FreeBSD.org
Wed Jan 13 10:38:54 CET 2016


commit 5d04b20099d30407ee3f8f885b6bcbfd7145544d
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Jan 13 09:38:14 2016 +0000

    This is sort of embarrasing:  I forgot to lock the busyobj when
    changing the storage list.
    
    Fixes: #1839

diff --git a/bin/varnishd/storage/storage_simple.c b/bin/varnishd/storage/storage_simple.c
index e039707..afbf6cc 100644
--- a/bin/varnishd/storage/storage_simple.c
+++ b/bin/varnishd/storage/storage_simple.c
@@ -442,7 +442,13 @@ sml_trimstore(struct worker *wrk, struct objcore *oc)
 		return;
 
 	if (st->len == 0) {
-		VTAILQ_REMOVE(&o->list, st, list);
+		if (oc->busyobj != NULL) {
+			Lck_Lock(&oc->busyobj->mtx);
+			VTAILQ_REMOVE(&o->list, st, list);
+			Lck_Unlock(&oc->busyobj->mtx);
+		} else {
+			VTAILQ_REMOVE(&o->list, st, list);
+		}
 		sml_stv_free(stv, st);
 		return;
 	}
@@ -461,8 +467,15 @@ sml_trimstore(struct worker *wrk, struct objcore *oc)
 
 	memcpy(st1->ptr, st->ptr, st->len);
 	st1->len = st->len;
-	VTAILQ_REMOVE(&o->list, st, list);
-	VTAILQ_INSERT_TAIL(&o->list, st1, list);
+	if (oc->busyobj != NULL) {
+		Lck_Lock(&oc->busyobj->mtx);
+		VTAILQ_REMOVE(&o->list, st, list);
+		VTAILQ_INSERT_TAIL(&o->list, st1, list);
+		Lck_Unlock(&oc->busyobj->mtx);
+	} else {
+		VTAILQ_REMOVE(&o->list, st, list);
+		VTAILQ_INSERT_TAIL(&o->list, st1, list);
+	}
 	if (oc->busyobj == NULL) {
 		sml_stv_free(stv, st);
 	} else {



More information about the varnish-commit mailing list