[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