[master] 1f226e6d8 Add a fixed-buffer strcpy analogous to bprintf
Nils Goroll
nils.goroll at uplex.de
Wed Oct 9 17:52:06 UTC 2019
commit 1f226e6d8c1c5443d9df127797c62b1e1228bfd1
Author: Nils Goroll <nils.goroll at uplex.de>
Date: Wed Oct 9 13:18:48 2019 +0200
Add a fixed-buffer strcpy analogous to bprintf
diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index 68e61524e..0b7c5cede 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -501,8 +501,8 @@ vca_accept_task(struct worker *wrk, void *arg)
wrk->stats->sess_fail++;
if (wa.acceptlsock->uds) {
- strcpy(laddr, "0.0.0.0");
- strcpy(lport, "0");
+ bstrcpy(laddr, "0.0.0.0");
+ bstrcpy(lport, "0");
} else {
VTCP_myname(ls->sock, laddr, VTCP_ADDRBUFSIZE,
lport, VTCP_PORTBUFSIZE);
diff --git a/bin/varnishd/cache/cache_ws.c b/bin/varnishd/cache/cache_ws.c
index a8e035ccf..7b1b6d8f8 100644
--- a/bin/varnishd/cache/cache_ws.c
+++ b/bin/varnishd/cache/cache_ws.c
@@ -104,8 +104,7 @@ WS_Init(struct ws *ws, const char *id, void *space, unsigned len)
*ws->e = 0x15;
ws->f = ws->s;
assert(id[0] & 0x20);
- assert(strlen(id) < sizeof ws->id);
- strcpy(ws->id, id);
+ bstrcpy(ws->id, id);
WS_Assert(ws);
}
diff --git a/bin/varnishd/storage/storage_persistent_subr.c b/bin/varnishd/storage/storage_persistent_subr.c
index 9f8d202af..32144f374 100644
--- a/bin/varnishd/storage/storage_persistent_subr.c
+++ b/bin/varnishd/storage/storage_persistent_subr.c
@@ -278,7 +278,6 @@ smp_newsilo(struct smp_sc *sc)
struct smp_ident *si;
ASSERT_MGT();
- assert(strlen(SMP_IDENT_STRING) < sizeof si->ident);
/* Choose a new random number */
AZ(VRND_RandomCrypto(&sc->unique, sizeof sc->unique));
@@ -287,7 +286,7 @@ smp_newsilo(struct smp_sc *sc)
si = sc->ident;
memset(si, 0, sizeof *si);
- strcpy(si->ident, SMP_IDENT_STRING);
+ bstrcpy(si->ident, SMP_IDENT_STRING);
si->byte_order = 0x12345678;
si->size = sizeof *si;
si->major_version = 2;
diff --git a/bin/varnishd/storage/storage_umem.c b/bin/varnishd/storage/storage_umem.c
index ace90356e..5ce3ce3d7 100644
--- a/bin/varnishd/storage/storage_umem.c
+++ b/bin/varnishd/storage/storage_umem.c
@@ -406,7 +406,7 @@ smu_open(struct stevedore *st)
smu_open_init();
- AN(strcpy(ident, st->ident));
+ bstrcpy(ident, st->ident);
smu_sc->smu_cache = umem_cache_createf(ident,
sizeof(struct smu),
0, // align
diff --git a/bin/varnishtest/vtc_server.c b/bin/varnishtest/vtc_server.c
index 160e165d7..3ff49705e 100644
--- a/bin/varnishtest/vtc_server.c
+++ b/bin/varnishtest/vtc_server.c
@@ -343,7 +343,7 @@ server_dispatch_thread(void *priv)
vtc_log(vl, 3, "dispatch fd %d -> %s", fd, snbuf);
s2 = server_new(snbuf, vl);
s2->spec = s->spec;
- strcpy(s2->listen, s->listen);
+ bstrcpy(s2->listen, s->listen);
s2->fd = fd;
s2->run = 1;
AZ(pthread_create(&s2->tp, NULL, server_dispatch_wrk, s2));
diff --git a/bin/varnishtest/vtc_varnish.c b/bin/varnishtest/vtc_varnish.c
index 010c2d915..f0d6d7bdc 100644
--- a/bin/varnishtest/vtc_varnish.c
+++ b/bin/varnishtest/vtc_varnish.c
@@ -508,7 +508,7 @@ varnish_launch(struct varnish *v)
assert(nfd >= 0);
assert(sizeof abuf >= CLI_AUTH_RESPONSE_LEN + 7);
- strcpy(abuf, "auth ");
+ bstrcpy(abuf, "auth ");
VCLI_AuthResponse(nfd, r, abuf + 5);
closefd(&nfd);
free(r);
diff --git a/include/vdef.h b/include/vdef.h
index 2c78fa041..dc622e273 100644
--- a/include/vdef.h
+++ b/include/vdef.h
@@ -56,6 +56,16 @@
assert(ivbprintf >= 0 && ivbprintf < (int)sizeof buf); \
} while (0)
+/* Safe strcpy into a fixed-size buffer */
+#define bstrcpy(dst, src) \
+ do { \
+ size_t lbstrcpy = strlen(src) + 1; \
+ assert(lbstrcpy <= sizeof dst); \
+ memcpy(dst, src, lbstrcpy); \
+ } while (0)
+
+// TODO #define strcpy BANNED
+
/* Close and discard filedescriptor */
#define closefd(fdp) \
do { \
More information about the varnish-commit
mailing list