[5.2] 5cf7f33 Properly implement VSC_Destroy()

PÃ¥l Hermunn Johansen hermunn at varnish-software.com
Fri Sep 15 11:17:13 UTC 2017


commit 5cf7f3347bd572857cab8d0c0ba1320268f0ced5
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri Sep 8 11:36:59 2017 +0000

    Properly implement VSC_Destroy()
    
    Fixes #2420

diff --git a/bin/varnishstat/varnishstat_curses.c b/bin/varnishstat/varnishstat_curses.c
index dec9c47..fb492f7 100644
--- a/bin/varnishstat/varnishstat_curses.c
+++ b/bin/varnishstat/varnishstat_curses.c
@@ -1041,7 +1041,7 @@ do_curses(struct vsm *vsm, struct vsc *vsc, double delay)
 			break;
 		}
 	}
-	VSC_Destroy(&vsc);
+	VSC_Destroy(&vsc, vsm);
 	AN(VTAILQ_EMPTY(&ptlist));
 	VSM_Destroy(&vsm);
 	AZ(endwin());
diff --git a/bin/varnishtest/vtc_varnish.c b/bin/varnishtest/vtc_varnish.c
index 965931c..6dfaae7 100644
--- a/bin/varnishtest/vtc_varnish.c
+++ b/bin/varnishtest/vtc_varnish.c
@@ -332,6 +332,10 @@ varnish_delete(struct varnish *v)
 	vtc_logclose(v->vl);
 	free(v->name);
 	free(v->workdir);
+	if (v->vsc != NULL)
+		VSC_Destroy(&v->vsc, v->vsm_vsc);
+	if (v->vsm_vsc != NULL)
+		VSM_Destroy(&v->vsm_vsc);
 	if (v->vsm_vsl != NULL)
 		VSM_Destroy(&v->vsm_vsl);
 
diff --git a/include/vapi/vsc.h b/include/vapi/vsc.h
index 969c243..88ac0b7 100644
--- a/include/vapi/vsc.h
+++ b/include/vapi/vsc.h
@@ -103,7 +103,7 @@ struct vsc *VSC_New(void);
 	 * Create a new VSC instance
 	 */
 
-void VSC_Destroy(struct vsc **);
+void VSC_Destroy(struct vsc **, struct vsm *);
 	/*
 	 * Destroy a VSC instance
 	 *
diff --git a/lib/libvarnishapi/vsc.c b/lib/libvarnishapi/vsc.c
index 417c834..8ca2572 100644
--- a/lib/libvarnishapi/vsc.c
+++ b/lib/libvarnishapi/vsc.c
@@ -121,33 +121,6 @@ VSC_New(void)
 
 /*--------------------------------------------------------------------*/
 
-static void
-vsc_delete_sf_list(struct vsc_sf_head *head)
-{
-	struct vsc_sf *sf;
-
-	while (!VTAILQ_EMPTY(head)) {
-		sf = VTAILQ_FIRST(head);
-		CHECK_OBJ_NOTNULL(sf, VSC_SF_MAGIC);
-		VTAILQ_REMOVE(head, sf, list);
-		free(sf->pattern);
-		FREE_OBJ(sf);
-	}
-}
-
-void
-VSC_Destroy(struct vsc **vscp)
-{
-	struct vsc *vsc;
-
-	TAKE_OBJ_NOTNULL(vsc, vscp, VSC_MAGIC);
-	vsc_delete_sf_list(&vsc->sf_list_include);
-	vsc_delete_sf_list(&vsc->sf_list_exclude);
-	FREE_OBJ(vsc);
-}
-
-/*--------------------------------------------------------------------*/
-
 static int
 vsc_f_arg(struct vsc *vsc, const char *opt)
 {
@@ -475,3 +448,36 @@ VSC_ChangeLevel(const struct VSC_level_desc *old, int chg)
 		i = 0;
 	return (levels[i]);
 }
+
+/*--------------------------------------------------------------------*/
+
+static void
+vsc_delete_sf_list(struct vsc_sf_head *head)
+{
+	struct vsc_sf *sf;
+
+	while (!VTAILQ_EMPTY(head)) {
+		sf = VTAILQ_FIRST(head);
+		CHECK_OBJ_NOTNULL(sf, VSC_SF_MAGIC);
+		VTAILQ_REMOVE(head, sf, list);
+		free(sf->pattern);
+		FREE_OBJ(sf);
+	}
+}
+
+void
+VSC_Destroy(struct vsc **vscp, struct vsm *vsm)
+{
+	struct vsc *vsc;
+	struct vsc_seg *sp, *sp2;
+
+	TAKE_OBJ_NOTNULL(vsc, vscp, VSC_MAGIC);
+	vsc_delete_sf_list(&vsc->sf_list_include);
+	vsc_delete_sf_list(&vsc->sf_list_exclude);
+	VTAILQ_FOREACH_SAFE(sp, &vsc->segs, list, sp2) {
+		VTAILQ_REMOVE(&vsc->segs, sp, list);
+		vsc_del_seg(vsc, vsm, sp);
+	}
+	FREE_OBJ(vsc);
+}
+


More information about the varnish-commit mailing list