[master] 1dee0bd19 Fix a mistake in keeping the list of VSCs up to date.

Poul-Henning Kamp phk at FreeBSD.org
Tue Apr 30 05:18:07 UTC 2019


commit 1dee0bd19e5a949740e8b18dc1b0723080dd0847
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Tue Apr 30 05:16:13 2019 +0000

    Fix a mistake in keeping the list of VSCs up to date.
    
    Fixes: 2576

diff --git a/lib/libvarnishapi/vsc.c b/lib/libvarnishapi/vsc.c
index 0c243fecd..20fb86a3b 100644
--- a/lib/libvarnishapi/vsc.c
+++ b/lib/libvarnishapi/vsc.c
@@ -282,14 +282,15 @@ vsc_fill_point(const struct vsc *vsc, const struct vsc_seg *seg,
 }
 
 static void
-vsc_del_seg(const struct vsc *vsc, struct vsm *vsm, struct vsc_seg *sp)
+vsc_del_seg(const struct vsc *vsc, struct vsm *vsm, struct vsc_seg **spp)
 {
 	unsigned u;
 	struct vsc_pt *pp;
+	struct vsc_seg *sp;
 
 	CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
 	AN(vsm);
-	CHECK_OBJ_NOTNULL(sp, VSC_SEG_MAGIC);
+	TAKE_OBJ_NOTNULL(sp, spp, VSC_SEG_MAGIC);
 	AZ(VSM_Unmap(vsm, sp->fantom));
 	if (sp->vj != NULL) {
 		vjsn_delete(&sp->vj);
@@ -425,7 +426,6 @@ VSC_Iter(struct vsc *vsc, struct vsm *vsm, VSC_iter_f *fiter, void *priv)
 		if (strcmp(ifantom.class, VSC_CLASS) &&
 		    strcmp(ifantom.class, VSC_DOC_CLASS))
 			continue;
-		sp2 = sp;
 		while (sp != NULL &&
 		    (strcmp(ifantom.ident, sp->fantom->ident) ||
 		    VSM_StillValid(vsm, sp->fantom) != VSM_valid)) {
@@ -433,22 +433,21 @@ VSC_Iter(struct vsc *vsc, struct vsm *vsm, VSC_iter_f *fiter, void *priv)
 			sp = VTAILQ_NEXT(sp, list);
 			VTAILQ_REMOVE(&vsc->segs, sp2, list);
 			vsc_expose(vsc, sp2, 1);
-			vsc_del_seg(vsc, vsm, sp2);
+			vsc_del_seg(vsc, vsm, &sp2);
 		}
 		if (sp == NULL) {
 			sp = vsc_add_seg(vsc, vsm, &ifantom);
 			if (sp != NULL) {
 				VTAILQ_INSERT_TAIL(&vsc->segs, sp, list);
-				sp2 = NULL;
 				vsc_expose(vsc, sp, 0);
 			}
 		} else {
 			vsc_expose(vsc, sp, 0);
-			sp2 = VTAILQ_NEXT(sp, list);
 		}
-		if (sp != NULL && fiter != NULL && sp->head->ready < 2)
+		if (sp != NULL && fiter != NULL && sp->head->ready < 2) {
 			i = vsc_iter_seg(vsc, sp, fiter, priv);
-		sp = sp2;
+			sp = VTAILQ_NEXT(sp, list);
+		}
 		if (i)
 			break;
 	}
@@ -457,7 +456,7 @@ VSC_Iter(struct vsc *vsc, struct vsm *vsm, VSC_iter_f *fiter, void *priv)
 		sp = VTAILQ_NEXT(sp, list);
 		VTAILQ_REMOVE(&vsc->segs, sp2, list);
 		vsc_expose(vsc, sp2, 1);
-		vsc_del_seg(vsc, vsm, sp2);
+		vsc_del_seg(vsc, vsm, &sp2);
 	}
 	return (i);
 }
@@ -533,7 +532,7 @@ VSC_Destroy(struct vsc **vscp, struct vsm *vsm)
 	VTAILQ_FOREACH_SAFE(sp, &vsc->segs, list, sp2) {
 		VTAILQ_REMOVE(&vsc->segs, sp, list);
 		vsc_expose(vsc, sp, 1);
-		vsc_del_seg(vsc, vsm, sp);
+		vsc_del_seg(vsc, vsm, &sp);
 	}
 	FREE_OBJ(vsc);
 }


More information about the varnish-commit mailing list