[experimental-ims] a8aa0ba Complete the VSC filtering, and make everything compile and pass tests.

Geoff Simmons geoff at varnish-cache.org
Mon Jan 9 21:52:41 CET 2012


commit a8aa0bafdcf6ffbabb4bd5a21fa2fd5d1c612f39
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Nov 23 21:09:18 2011 +0000

    Complete the VSC filtering, and make everything compile and pass tests.
    
    Still not done, in particular: Do not roll any releases until
    libvarnishapi symbo/version stuff has been polished.
    
    Fixes	#829

diff --git a/bin/varnishadm/varnishadm.c b/bin/varnishadm/varnishadm.c
index f5d6054..4570e3c 100644
--- a/bin/varnishadm/varnishadm.c
+++ b/bin/varnishadm/varnishadm.c
@@ -282,25 +282,27 @@ n_arg_sock(const char *n_arg)
 	struct VSM_data *vsd;
 	char *p;
 	int sock;
+	struct VSM_fantom vt;
 
 	vsd = VSM_New();
 	assert(VSL_Arg(vsd, 'n', n_arg));
-	if (VSM_Open(vsd, 1)) {
-		fprintf(stderr, "Could not open shared memory\n");
+	if (VSM_Open(vsd)) {
+		fprintf(stderr, "%s\n", VSM_Error(vsd));
 		return (-1);
 	}
 	if (T_arg == NULL) {
-		p = VSM_Find_Chunk(vsd, "Arg", "-T", "", NULL);
-		if (p == NULL)  {
+		if (VSM_Get(vsd, &vt, "Arg", "-T", "")) {
 			fprintf(stderr, "No -T arg in shared memory\n");
 			return (-1);
 		}
-		T_start = T_arg = strdup(p);
+		T_start = T_arg = strdup(vt.b);
 	}
 	if (S_arg == NULL) {
-		p = VSM_Find_Chunk(vsd, "Arg", "-S", "", NULL);
-		if (p != NULL)
-			S_arg = strdup(p);
+		if (VSM_Get(vsd, &vt, "Arg", "-S", "")) {
+			fprintf(stderr, "No -S arg in shared memory\n");
+			return (-1);
+		}
+		S_arg = strdup(vt.b);
 	}
 	sock = -1;
 	while (*T_arg) {
diff --git a/bin/varnishhist/varnishhist.c b/bin/varnishhist/varnishhist.c
index a4bc6b7..852ff41 100644
--- a/bin/varnishhist/varnishhist.c
+++ b/bin/varnishhist/varnishhist.c
@@ -351,7 +351,6 @@ main(int argc, char **argv)
 	match_tag = -1;
 
 	vd = VSM_New();
-	VSL_Setup(vd);
 
 	while ((o = getopt(argc, argv, VSL_ARGS "Vw:r:R:f:p:")) != -1) {
 		switch (o) {
@@ -424,8 +423,10 @@ main(int argc, char **argv)
 	}
 	strcpy(format + 4*(fnum-1), "%lf");
 
-	if (VSL_Open(vd, 1))
+	if (VSM_Open(vd)) {
+		fprintf(stderr, "%s\n", VSM_Error(vd));
 		exit(1);
+	}
 
 	log_ten = log(10.0);
 
diff --git a/bin/varnishlog/varnishlog.c b/bin/varnishlog/varnishlog.c
index e15d102..45b4327 100644
--- a/bin/varnishlog/varnishlog.c
+++ b/bin/varnishlog/varnishlog.c
@@ -60,7 +60,7 @@ static uint64_t       bitmap[65536];
 #define F_INVCL		(1 << 0)
 
 static void
-h_order_finish(int fd, const struct VSM_data *vd)
+h_order_finish(int fd, struct VSM_data *vd)
 {
 
 	AZ(VSB_finish(ob[fd]));
@@ -72,7 +72,7 @@ h_order_finish(int fd, const struct VSM_data *vd)
 }
 
 static void
-clean_order(const struct VSM_data *vd)
+clean_order(struct VSM_data *vd)
 {
 	unsigned u;
 
@@ -234,7 +234,7 @@ open_log(const char *w_arg, int a_flag)
 }
 
 static void
-do_write(const struct VSM_data *vd, const char *w_arg, int a_flag)
+do_write(struct VSM_data *vd, const char *w_arg, int a_flag)
 {
 	int fd, i, l;
 	uint32_t *p;
@@ -243,7 +243,7 @@ do_write(const struct VSM_data *vd, const char *w_arg, int a_flag)
 	XXXAN(fd >= 0);
 	(void)signal(SIGHUP, sighup);
 	while (1) {
-		i = VSL_NextLog(vd, &p, NULL);
+		i = VSL_NextSLT(vd, &p, NULL);
 		if (i < 0)
 			break;
 		if (i > 0) {
@@ -285,7 +285,6 @@ main(int argc, char * const *argv)
 	struct VSM_data *vd;
 
 	vd = VSM_New();
-	VSL_Setup(vd);
 
 	while ((c = getopt(argc, argv, VSL_ARGS "aDP:uVw:oO")) != -1) {
 		switch (c) {
@@ -336,8 +335,10 @@ main(int argc, char * const *argv)
 	if ((argc - optind) > 0)
 		usage();
 
-	if (VSL_Open(vd, 1))
+	if (VSM_Open(vd)) {
+		fprintf(stderr, "%s\n", VSM_Error(vd));
 		exit(1);
+	}
 
 	if (P_arg && (pfh = VPF_Open(P_arg, 0644, NULL)) == NULL) {
 		perror(P_arg);
diff --git a/bin/varnishncsa/varnishncsa.c b/bin/varnishncsa/varnishncsa.c
index 9765796..5561adc 100644
--- a/bin/varnishncsa/varnishncsa.c
+++ b/bin/varnishncsa/varnishncsa.c
@@ -846,7 +846,6 @@ main(int argc, char *argv[])
 	format = "%h %l %u %t \"%r\" %s %b \"%{Referer}i\" \"%{User-agent}i\"";
 
 	vd = VSM_New();
-	VSL_Setup(vd);
 
 	while ((c = getopt(argc, argv, VSL_ARGS "aDP:Vw:fF:")) != -1) {
 		switch (c) {
@@ -907,8 +906,10 @@ main(int argc, char *argv[])
 
 	VSL_Arg(vd, 'c', optarg);
 
-	if (VSL_Open(vd, 1))
-		exit(1);
+	if (VSM_Open(vd)) {
+		fprintf(stderr, "%s\n", VSM_Error(vd));
+		return (-1);
+	}
 
 	if (P_arg && (pfh = VPF_Open(P_arg, 0644, NULL)) == NULL) {
 		perror(P_arg);
diff --git a/bin/varnishreplay/varnishreplay.c b/bin/varnishreplay/varnishreplay.c
index 12b6c41..8e694da 100644
--- a/bin/varnishreplay/varnishreplay.c
+++ b/bin/varnishreplay/varnishreplay.c
@@ -707,7 +707,6 @@ main(int argc, char *argv[])
 	const char *address = NULL;
 
 	vd = VSM_New();
-	VSL_Setup(vd);
 	debug = 0;
 
 	VSL_Arg(vd, 'c', NULL);
@@ -730,8 +729,10 @@ main(int argc, char *argv[])
 		usage();
 	}
 
-	if (VSL_Open(vd, 1))
+	if (VSM_Open(vd)) {
+		fprintf(stderr, "%s\n", VSM_Error(vd));
 		exit(1);
+	}
 
 	addr_info = init_connection(address);
 
diff --git a/bin/varnishtest/flint.lnt b/bin/varnishtest/flint.lnt
index 53ad3dc..9ff3c68 100644
--- a/bin/varnishtest/flint.lnt
+++ b/bin/varnishtest/flint.lnt
@@ -25,3 +25,5 @@
 -e713	// Loss of precision (assignment) (unsigned long long to long long)
 -e574	// Signed-unsigned mix with relational
 -e835	//  A zero has been given as ___ argument to operator '___'  (<<)
+-e786	// String concatenation within initializer
+
diff --git a/bin/varnishtest/vtc_varnish.c b/bin/varnishtest/vtc_varnish.c
index 080f48a..2f7514a 100644
--- a/bin/varnishtest/vtc_varnish.c
+++ b/bin/varnishtest/vtc_varnish.c
@@ -198,11 +198,7 @@ varnishlog_thread(void *priv)
 
 	CAST_OBJ_NOTNULL(v, priv, VARNISH_MAGIC);
 	vsl = VSM_New();
-	VSL_Setup(vsl);
 	(void)VSL_Arg(vsl, 'n', v->workdir);
-	while (v->pid  && VSL_Open(vsl, 0) != 0) {
-		assert(usleep(VSL_SLEEP_USEC) == 0 || errno == EINTR);
-	}
 	while (v->pid) {
 		if (VSL_Dispatch(vsl, h_addlog, v) <= 0)
 			break;
@@ -332,7 +328,6 @@ varnish_launch(struct varnish *v)
 	char *r;
 
 	v->vd = VSM_New();
-	VSC_Setup(v->vd);
 
 	/* Create listener socket */
 	nap = VSS_resolve("127.0.0.1", "0", &ap);
@@ -457,7 +452,7 @@ varnish_launch(struct varnish *v)
 	free(r);
 
 	(void)VSL_Arg(v->vd, 'n', v->workdir);
-	AZ(VSC_Open(v->vd, 1));
+	AZ(VSM_Open(v->vd));
 }
 
 /**********************************************************************
@@ -696,6 +691,8 @@ do_stat_cb(void *priv, const struct VSC_point * const pt)
 	const char *p = sp->target;
 	int i;
 
+	if (pt == NULL)
+		return(0);
 	if (strcmp(pt->class, "")) {
 		i = strlen(pt->class);
 		if (memcmp(pt->class, p, i))
@@ -714,10 +711,10 @@ do_stat_cb(void *priv, const struct VSC_point * const pt)
 			return (0);
 		p++;
 	}
-	if (strcmp(pt->name, p))
+	if (strcmp(pt->desc->name, p))
 		return (0);
 
-	assert(!strcmp(pt->fmt, "uint64_t"));
+	assert(!strcmp(pt->desc->fmt, "uint64_t"));
 	sp->val = *(const volatile uint64_t*)pt->ptr;
 	return (1);
 }
@@ -740,12 +737,12 @@ varnish_expect(const struct varnish *v, char * const *av) {
 		good = VSC_Iter(v->vd, do_stat_cb, &sp);
 		if (good < 0) {
 			VSM_Close(v->vd);
-			j = VSM_Open(v->vd, 0);
+			j = VSM_Open(v->vd);
 			if (j == 0)
 				continue;
 			do {
 				(void)usleep(100000);
-				j = VSM_Open(v->vd, 0);
+				j = VSM_Open(v->vd);
 				i++;
 			} while(i < 10 && j < 0);
 			if (j < 0)
diff --git a/bin/varnishtop/varnishtop.c b/bin/varnishtop/varnishtop.c
index efe312e..62efb15 100644
--- a/bin/varnishtop/varnishtop.c
+++ b/bin/varnishtop/varnishtop.c
@@ -195,7 +195,7 @@ accumulate_thread(void *arg)
 
 	for (;;) {
 
-		i = VSL_NextLog(vd, &p, NULL);
+		i = VSL_NextSLT(vd, &p, NULL);
 		if (i < 0)
 			break;
 		if (i == 0) {
@@ -292,7 +292,7 @@ do_once(struct VSM_data *vd)
 {
 	uint32_t *p;
 
-	while (VSL_NextLog(vd, &p, NULL) > 0)
+	while (VSL_NextSLT(vd, &p, NULL) > 0)
 		accumulate(p);
 	dump();
 }
@@ -313,7 +313,6 @@ main(int argc, char **argv)
 	float period = 60; /* seconds */
 
 	vd = VSM_New();
-	VSL_Setup(vd);
 
 	while ((o = getopt(argc, argv, VSL_ARGS "1fVp:")) != -1) {
 		switch (o) {
@@ -345,11 +344,12 @@ main(int argc, char **argv)
 		}
 	}
 
-	if (VSL_Open(vd, 1))
+	if (VSM_Open(vd)) {
+		fprintf(stderr, "%s\n", VSM_Error(vd));
 		exit (1);
+	}
 
 	if (once) {
-		VSL_NonBlocking(vd, 1);
 		do_once(vd);
 	} else {
 		do_curses(vd, period);
diff --git a/include/vapi/vsc.h b/include/vapi/vsc.h
index 6ebab31..16a1583 100644
--- a/include/vapi/vsc.h
+++ b/include/vapi/vsc.h
@@ -88,13 +88,13 @@ int VSC_Iter(struct VSM_data *vd, VSC_iter_f *func, void *priv);
 	 * Iterate over all statistics counters, calling "func" for
 	 * each counter not suppressed by any "-f" arguments.
 	 *
- 	 * Func is called with pt == NULL, whenever VSM allocations
+	 * Func is called with pt == NULL, whenever VSM allocations
 	 * change (child restart, allocations/deallocations)
 	 *
 	 * Returns:
-	 * 	!=0:	func returned non-zero
+	 *	!=0:	func returned non-zero
 	 *	-1:	No VSC's available
-	 *	0: 	Done
+	 *	0:	Done
 	 */
 
 /**********************************************************************
diff --git a/include/vapi/vsl.h b/include/vapi/vsl.h
index 35e09dc..dfe5a83 100644
--- a/include/vapi/vsl.h
+++ b/include/vapi/vsl.h
@@ -36,7 +36,7 @@
  *	VSL_Arg(vd, "r", "/some/file");
  * and once VSL_Dispatch()/VSL_NextSLT() will indicate EOF by returning -2.
  * Another file can then be opened with VSL_Arg() and processed.
- * 
+ *
  */
 
 #ifndef VAPI_VSL_H_INCLUDED
diff --git a/lib/libvarnishapi/libvarnishapi.map b/lib/libvarnishapi/libvarnishapi.map
index 83f5169..5640868 100644
--- a/lib/libvarnishapi/libvarnishapi.map
+++ b/lib/libvarnishapi/libvarnishapi.map
@@ -75,3 +75,12 @@ LIBVARNISHAPI_1.1 {
 	VSL_Name2Tag;
 	# Variables:
 } LIBVARNISHAPI_1.0;
+
+LIBVARNISHAPI_1.2 {
+  global:
+	# Functions:
+	VSL_NextSLT;
+	VSM_Error;
+	VSM_Get;
+	# Variables:
+} LIBVARNISHAPI_1.0;
diff --git a/lib/libvarnishapi/vsc.c b/lib/libvarnishapi/vsc.c
index 54bf20f..b399c98 100644
--- a/lib/libvarnishapi/vsc.c
+++ b/lib/libvarnishapi/vsc.c
@@ -50,8 +50,9 @@
 struct vsc_pt {
 	unsigned		magic;
 #define VSC_PT_MAGIC		0xa4ff159a
-	struct VSC_point	point;
 	VTAILQ_ENTRY(vsc_pt)	list;
+	struct VSM_fantom	vf;
+	struct VSC_point	point;
 };
 
 struct vsc_sf {
@@ -101,15 +102,10 @@ static void
 vsc_delete_pts(struct vsc *vsc)
 {
 	struct vsc_pt *pt;
-	struct VSM_fantom *vf = NULL;
 
 	while(!VTAILQ_EMPTY(&vsc->pt_list)) {
 		pt = VTAILQ_FIRST(&vsc->pt_list);
 		VTAILQ_REMOVE(&vsc->pt_list, pt, list);
-		if (pt->point.vf != vf) {
-			vf = pt->point.vf;
-			free(vf);
-		}
 		FREE_OBJ(pt);
 	}
 }
@@ -243,129 +239,13 @@ VSC_Main(struct VSM_data *vd)
 	return ((void*)vsc->main_fantom.b);
 }
 
-#if 0
-/*--------------------------------------------------------------------
- * -1 -> unknown stats encountered.
- */
-
-static inline int
-iter_test(const char *s1, const char *s2, int wc)
-{
-
-	if (s1 == NULL)
-		return (0);
-	if (!wc)
-		return (strcmp(s1, s2));
-	for (; *s1 != '\0' && *s1 == *s2; s1++, s2++)
-		continue;
-	return (*s1 != '\0');
-}
-
-static int
-iter_call(const struct vsc *vsc, VSC_iter_f *func, void *priv,
-    const struct VSC_point *const sp)
-{
-	struct vsc_sf *sf;
-	struct vsc_pt *pt;
-	int good;
-
-	CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);
-
-	ALLOC_OBJ(pt, VSC_PT_MAGIC);
-	AN(pt);
-
-	if (VTAILQ_EMPTY(&vsc->sf_list)) {
-		VTAILQ_INSERT_TAIL(&vsc->pt_list, pt, list);
-		return (func(priv, sp));
-	}
-
-	good = 0;
-	VTAILQ_FOREACH(sf, &vsc->sf_list, list) {
-		if (iter_test(sf->class, sp->class, sf->flags & VSC_SF_CL_WC))
-			continue;
-		if (iter_test(sf->ident, sp->ident, sf->flags & VSC_SF_ID_WC))
-			continue;
-		if (iter_test(sf->name, sp->desc->name, sf->flags & VSC_SF_NM_WC))
-			continue;
-		if (sf->flags & VSC_SF_EXCL)
-			good = 0;
-		else
-			good = 1;
-	}
-	if (!good)
-		return (0);
-	return (func(priv, sp));
-}
-
-#define VSC_DO(U,l,t)							\
-	static void							\
-	iter_##l(const struct vsc *vsc, struct VSM_fantom *vf,		\
-	    const struct VSC_desc *descs)				\
-	{								\
-		struct VSC_C_##l *st;					\
-		struct VSM_fantom *vf2;					\
-		int i;							\
-									\
-		CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);			\
-		st = vf->b;						\
-		sp.class = t;						\
-		sp.ident = vf->chunk->ident;				\
-		sp.desc = descs++;					\
-		vf2 = malloc(sizeof *vf2);				\
-		AN(vf2);						\
-		memcpy(vf2, vf, sizeof *vf2);
-
-#define VSC_F(nn,tt,ll,ff,dd,ee)					\
-		sp.ptr = &st->nn;					\
-		sp.vf = vf2;						\
-		i = iter_call(vsc, &sp);				\
-		if (i)							\
-			return(i);
-
-#define VSC_DONE(U,l,t)							\
-		return (0);						\
-	}
-
-#include "tbl/vsc_all.h"
-#undef VSC_DO
-#undef VSC_F
-#undef VSC_DONE
-
-static void
-vsc_build_pt_list(struct VSM_data *vd)
-{
-	struct vsc *vsc = vsc_setup(vd);
-	struct VSM_fantom vf;
-
-	vsc_delete_pts(vsc *vsc);
-
-	VSM_FOREACH_SAFE(&vf, vd) {
-		if (strcmp(vf.chunk->class, VSC_CLASS))
-			continue;
-		/*lint -save -e525 -e539 */
-#define VSC_F(n,t,l,f,d,e)
-#define VSC_DONE(a,b,c)
-#define VSC_DO(U,l,t)						\
-		if (!strcmp(vf.chunk->type, t))			\
-			iter_##l(vsc, &vf, VSC_desc_##l);
-#include "tbl/vsc_all.h"
-#undef VSC_F
-#undef VSC_DO
-#undef VSC_DONE
-		/*lint -restore */
-		break;
-	}
-	return (i);
-}
-#endif
-
 /*--------------------------------------------------------------------
  */
 
 static void
 vsc_add_pt(struct vsc *vsc, const char *class, const char *ident,
     const struct VSC_desc *desc, const volatile void *ptr,
-    struct VSM_fantom *vf)
+    const struct VSM_fantom *vf)
 {
 	struct vsc_pt *pt;
 
@@ -375,7 +255,8 @@ vsc_add_pt(struct vsc *vsc, const char *class, const char *ident,
 	pt->point.ident = ident;
 	pt->point.desc = desc;
 	pt->point.ptr = ptr;
-	pt->point.vf = vf;
+	pt->point.vf = &pt->vf;
+	pt->vf = *vf;
 	VTAILQ_INSERT_TAIL(&vsc->pt_list, pt, list);
 }
 
@@ -385,18 +266,14 @@ vsc_add_pt(struct vsc *vsc, const char *class, const char *ident,
 	    const struct VSC_desc *descs)				\
 	{								\
 		struct VSC_C_##l *st;					\
-		struct VSM_fantom *vf2;					\
 		const char *class = t;					\
 									\
 		CHECK_OBJ_NOTNULL(vsc, VSC_MAGIC);			\
 		st = vf->b;						\
-		vf2 = malloc(sizeof *vf2);				\
-		AN(vf2);						\
-		memcpy(vf2, vf, sizeof *vf2);
 
 #define VSC_F(nn,tt,ll,ff,dd,ee)					\
 		vsc_add_pt(vsc, class, vf->chunk->ident, descs++,	\
-		    &st->nn, vf2);
+		    &st->nn, vf);
 
 #define VSC_DONE(U,l,t)							\
 	}
@@ -409,6 +286,8 @@ vsc_add_pt(struct vsc *vsc, const char *class, const char *ident,
 /*--------------------------------------------------------------------
  */
 
+#include <stdio.h>
+
 static void
 vsc_build_pt_list(struct VSM_data *vd)
 {
@@ -432,8 +311,57 @@ vsc_build_pt_list(struct VSM_data *vd)
 #undef VSC_DONE
 		/*lint -restore */
 	}
+}
 
-	/* XXX: filter pt list */
+/*--------------------------------------------------------------------
+ */
+
+static inline int
+iter_test(const char *s1, const char *s2, int wc)
+{
+
+	if (s1 == NULL)
+		return (0);
+	if (!wc)
+		return (strcmp(s1, s2));
+	for (; *s1 != '\0' && *s1 == *s2; s1++, s2++)
+		continue;
+	return (*s1 != '\0');
+}
+
+static void
+vsc_filter_pt_list(struct VSM_data *vd)
+{
+	struct vsc *vsc = vsc_setup(vd);
+	struct vsc_sf *sf;
+	struct vsc_pt *pt, *pt2;
+	VTAILQ_HEAD(, vsc_pt)	pt_list;
+
+	if (VTAILQ_EMPTY(&vsc->sf_list))
+		return;
+
+	VTAILQ_INIT(&pt_list);
+	VTAILQ_FOREACH(sf, &vsc->sf_list, list) {
+		VTAILQ_FOREACH_SAFE(pt, &vsc->pt_list, list, pt2) {
+			if (iter_test(sf->class, pt->point.class,
+			    sf->flags & VSC_SF_CL_WC))
+				continue;
+			if (iter_test(sf->ident, pt->point.ident,
+			    sf->flags & VSC_SF_ID_WC))
+				continue;
+			if (iter_test(sf->name, pt->point.desc->name,
+			    sf->flags & VSC_SF_NM_WC))
+				continue;
+			VTAILQ_REMOVE(&vsc->pt_list, pt, list);
+			if (sf->flags & VSC_SF_EXCL) {
+				FREE_OBJ(pt);
+			} else {
+				VTAILQ_INSERT_TAIL(&pt_list, pt, list);
+			}
+		}
+	}
+	vsc_delete_pts(vsc);
+	VTAILQ_CONCAT(&vsc->pt_list, &pt_list, list);
 }
 
 /*--------------------------------------------------------------------
@@ -456,8 +384,10 @@ VSC_Iter(struct VSM_data *vd, VSC_iter_f *func, void *priv)
 			}
 		}
 		AN(vd->head);
-		func(priv, NULL);
+		/* Tell app that list will be nuked */
+		(void)func(priv, NULL);
 		vsc_build_pt_list(vd);
+		vsc_filter_pt_list(vd);
 	}
 	AN(vd->head);
 	VTAILQ_FOREACH(pt, &vsc->pt_list, list) {
diff --git a/lib/libvarnishapi/vsl.c b/lib/libvarnishapi/vsl.c
index d45e1c3..fdd93d8 100644
--- a/lib/libvarnishapi/vsl.c
+++ b/lib/libvarnishapi/vsl.c
@@ -296,7 +296,7 @@ VSL_NextSLT(struct VSM_data *vd, uint32_t **pp, uint64_t *bits)
 				if (vrm->tag == t) {
 					i = VRE_exec(vrm->re, VSL_DATA(p),
 					    VSL_LEN(p), 0, 0, NULL, 0, NULL);
-					if (i >= 0) 	/* XXX ?? */
+					if (i >= 0)	/* XXX ?? */
 						*bits |= (uintmax_t)1 << j;
 				}
 				j++;
diff --git a/lib/libvarnishapi/vsl_arg.c b/lib/libvarnishapi/vsl_arg.c
index 100d75a..068d539 100644
--- a/lib/libvarnishapi/vsl_arg.c
+++ b/lib/libvarnishapi/vsl_arg.c
@@ -160,10 +160,10 @@ vsl_ix_arg(struct VSM_data *vd, const char *opt, int arg)
 			else
 				vbit_clr(vsl->vbm_supress, i);
 		} else if (i == -2) {
-			return (vsm_diag(vd, 
+			return (vsm_diag(vd,
 			    "\"%*.*s\" matches multiple tags\n", l, l, b));
 		} else {
-			return (vsm_diag(vd, 
+			return (vsm_diag(vd,
 			    "Could not match \"%*.*s\" to any tag\n", l, l, b));
 		}
 	}
@@ -243,10 +243,10 @@ vsl_k_arg(struct VSM_data *vd, const char *opt)
 	char *end;
 
 	CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
-	if (*opt == '\0') 
+	if (*opt == '\0')
 		return (vsm_diag(vd, "number required for -k\n"));
 	vsl->keep = strtoul(opt, &end, 10);
-	if (*end != '\0') 
+	if (*end != '\0')
 		return (vsm_diag(vd, "invalid number for -k\n"));
 	return (1);
 }
diff --git a/lib/libvarnishapi/vsm.c b/lib/libvarnishapi/vsm.c
index a9f176c..18de315 100644
--- a/lib/libvarnishapi/vsm.c
+++ b/lib/libvarnishapi/vsm.c
@@ -86,6 +86,7 @@ vsm_diag(struct VSM_data *vd, const char *fmt, ...)
 	if (vd->diag == NULL)
 		vd->diag = VSB_new_auto();
 	AN(vd->diag);
+	VSB_clear(vd->diag);
 	va_start(ap, fmt);
 	VSB_vprintf(vd->diag, fmt, ap);
 	va_end(ap);
@@ -328,6 +329,8 @@ VSM_StillValid(const struct VSM_data *vd, struct VSM_fantom *vf)
 
 	CHECK_OBJ_NOTNULL(vd, VSM_MAGIC);
 	AN(vf);
+	if (!vd->head)
+		return (0);
 	if (!vd->head->alloc_seq)
 		return (0);
 	if (vf->priv == vd->head->alloc_seq)



More information about the varnish-commit mailing list