[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