[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