[master] c8eedc2 Add macro_expandf() to avoid unhealthy use of local buffers.

Poul-Henning Kamp phk at FreeBSD.org
Wed Jan 10 12:44:12 UTC 2018


commit c8eedc29c4458cd088023181d039b78f90aa5b11
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Wed Jan 10 07:05:12 2018 +0000

    Add macro_expandf() to avoid unhealthy use of local buffers.

diff --git a/bin/varnishtest/vtc.c b/bin/varnishtest/vtc.c
index 950b003..02e8da3 100644
--- a/bin/varnishtest/vtc.c
+++ b/bin/varnishtest/vtc.c
@@ -211,6 +211,23 @@ macro_get(const char *b, const char *e)
 }
 
 struct vsb *
+macro_expandf(struct vtclog *vl, const char *fmt, ...)
+{
+	va_list ap;
+	struct vsb *vsb1, *vsb2;
+
+	vsb1 = VSB_new_auto();
+	AN(vsb1);
+	va_start(ap, fmt);
+	VSB_vprintf(vsb1, fmt, ap);
+	va_end(ap);
+	AZ(VSB_finish(vsb1));
+	vsb2 = macro_expand(vl, VSB_data(vsb1));
+	VSB_destroy(&vsb1);
+	return (vsb2);
+}
+
+struct vsb *
 macro_expand(struct vtclog *vl, const char *text)
 {
 	struct vsb *vsb;
diff --git a/bin/varnishtest/vtc.h b/bin/varnishtest/vtc.h
index 52e12e5..af89358 100644
--- a/bin/varnishtest/vtc.h
+++ b/bin/varnishtest/vtc.h
@@ -121,6 +121,8 @@ void macro_def(struct vtclog *vl, const char *instance, const char *name,
     const char *fmt, ...)
     v_printflike_(4, 5);
 struct vsb *macro_expand(struct vtclog *vl, const char *text);
+struct vsb *macro_expandf(struct vtclog *vl, const char *, ...)
+    v_printflike_(2, 3);
 
 void extmacro_def(const char *name, const char *fmt, ...)
     v_printflike_(2, 3);
diff --git a/bin/varnishtest/vtc_barrier.c b/bin/varnishtest/vtc_barrier.c
index 0280211..f7f68af 100644
--- a/bin/varnishtest/vtc_barrier.c
+++ b/bin/varnishtest/vtc_barrier.c
@@ -299,9 +299,7 @@ barrier_sock_sync(struct barrier *b, struct vtclog *vl)
 	CHECK_OBJ_NOTNULL(b, BARRIER_MAGIC);
 	assert(b->type == BARRIER_SOCK);
 
-	i = snprintf(buf, sizeof buf, "${%s_sock}", b->name);
-	assert(i > 0 && i < sizeof buf);
-	vsb = macro_expand(vl, buf);
+	vsb = macro_expandf(vl, "${%s_sock}", b->name);
 	vtc_log(vl, 4, "Barrier(%s) sync with socket", b->name);
 
 	sock = VTCP_open(VSB_data(vsb), NULL, 0., &err);
diff --git a/bin/varnishtest/vtc_client.c b/bin/varnishtest/vtc_client.c
index c4d4ad8..167d80c 100644
--- a/bin/varnishtest/vtc_client.c
+++ b/bin/varnishtest/vtc_client.c
@@ -117,7 +117,6 @@ client_thread(void *priv)
 	int fd;
 	unsigned u;
 	struct vsb *vsb;
-	char *p;
 	char mabuf[32], mpbuf[32];
 	const char *err;
 
@@ -126,9 +125,7 @@ client_thread(void *priv)
 
 	vl = vtc_logopen(c->name);
 
-	p = strdup(c->connect);
-	AN(p);
-	vsb = macro_expand(vl, p);
+	vsb = macro_expand(vl, c->connect);
 	AN(vsb);
 
 	if (c->repeat == 0)
@@ -155,7 +152,6 @@ client_thread(void *priv)
 	}
 	vtc_log(vl, 2, "Ending");
 	VSB_destroy(&vsb);
-	free(p);
 	return (NULL);
 }
 
diff --git a/bin/varnishtest/vtc_logexp.c b/bin/varnishtest/vtc_logexp.c
index 5b983f1..cbb3c07 100644
--- a/bin/varnishtest/vtc_logexp.c
+++ b/bin/varnishtest/vtc_logexp.c
@@ -200,7 +200,7 @@ static struct logexp *
 logexp_new(const char *name, const char *varg)
 {
 	struct logexp *le;
-	struct vsb *vsb, *n_arg;
+	struct vsb *n_arg;
 
 	ALLOC_OBJ(le, LOGEXP_MAGIC);
 	AN(le);
@@ -219,12 +219,7 @@ logexp_new(const char *name, const char *varg)
 
 	REPLACE(le->vname, varg);
 
-	vsb = VSB_new_auto();
-	AN(vsb);
-	AZ(VSB_printf(vsb, "${tmpdir}/%s", varg));
-	AZ(VSB_finish(vsb));
-	n_arg = macro_expand(le->vl, VSB_data(vsb));
-	VSB_destroy(&vsb);
+	n_arg = macro_expandf(le->vl, "${tmpdir}/%s", varg);
 	if (n_arg == NULL)
 		vtc_fatal(le->vl, "-v argument problems");
 	if (VSM_Arg(le->vsm, 'n', VSB_data(n_arg)) <= 0)
diff --git a/bin/varnishtest/vtc_process.c b/bin/varnishtest/vtc_process.c
index cb168eb..e6d9ad1 100644
--- a/bin/varnishtest/vtc_process.c
+++ b/bin/varnishtest/vtc_process.c
@@ -71,14 +71,13 @@ static VTAILQ_HEAD(, process)	processes =
  * Allocate and initialize a process
  */
 
-#define PROCESS_EXPAND(field, format, ...)		\
-	do {						\
-		bprintf(buf, format, __VA_ARGS__);	\
-		vsb = macro_expand(p->vl, buf);		\
-		AN(vsb);				\
-		p->field = strdup(VSB_data(vsb));	\
-		AN(p->field);				\
-		VSB_destroy(&vsb);			\
+#define PROCESS_EXPAND(field, format, ...)				\
+	do {								\
+		vsb = macro_expandf(p->vl, format, __VA_ARGS__);	\
+		AN(vsb);						\
+		p->field = strdup(VSB_data(vsb));			\
+		AN(p->field);						\
+		VSB_destroy(&vsb);					\
 	} while (0)
 
 static struct process *
diff --git a/bin/varnishtest/vtc_varnish.c b/bin/varnishtest/vtc_varnish.c
index 569ad7b..1b0934a 100644
--- a/bin/varnishtest/vtc_varnish.c
+++ b/bin/varnishtest/vtc_varnish.c
@@ -308,8 +308,7 @@ varnish_new(const char *name)
 	v->vl = vtc_logopen(name);
 	AN(v->vl);
 
-	bprintf(buf, "${tmpdir}/%s", name);
-	vsb = macro_expand(v->vl, buf);
+	vsb = macro_expandf(v->vl, "${tmpdir}/%s", name);
 	AN(vsb);
 	v->workdir = strdup(VSB_data(vsb));
 	AN(v->workdir);


More information about the varnish-commit mailing list