git: 2cab4be46b0e - main - install: Prefer strsnvis() to strsvis().

From: Dag-Erling Smørgrav <des_at_FreeBSD.org>
Date: Wed, 27 Mar 2024 11:26:24 UTC
The branch main has been updated by des:

URL: https://cgit.FreeBSD.org/src/commit/?id=2cab4be46b0eeb64b8ade010bc16245151af5ccd

commit 2cab4be46b0eeb64b8ade010bc16245151af5ccd
Author:     Dag-Erling Smørgrav <des@FreeBSD.org>
AuthorDate: 2024-03-27 10:03:59 +0000
Commit:     Dag-Erling Smørgrav <des@FreeBSD.org>
CommitDate: 2024-03-27 10:03:59 +0000

    install: Prefer strsnvis() to strsvis().
    
    MFC after:      1 week
    Sponsored by:   Klara, Inc.
    Reviewed by:    allanjude
    Differential Revision:  https://reviews.freebsd.org/D44514
---
 usr.bin/xinstall/xinstall.c | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/usr.bin/xinstall/xinstall.c b/usr.bin/xinstall/xinstall.c
index 1e5adadd8f49..01e5bf0b5174 100644
--- a/usr.bin/xinstall/xinstall.c
+++ b/usr.bin/xinstall/xinstall.c
@@ -1529,15 +1529,18 @@ metadata_log(const char *path, const char *type, struct timespec *ts,
 	static const char extra[] = { ' ', '\t', '\n', '\\', '#', '\0' };
 	const char *p;
 	char *buf;
-	size_t destlen;
+	size_t buflen, destlen;
 	struct flock metalog_lock;
 
 	if (!metafp)	
 		return;
-	/* Buffer for strsvis(3). */
-	buf = (char *)malloc(4 * strlen(path) + 1);
-	if (buf == NULL) {
-		warnx("%s", strerror(ENOMEM));
+	/* Buffer for strsnvis(3), used for both path and slink. */
+	buflen = strlen(path);
+	if (slink && strlen(slink) > buflen)
+		buflen = strlen(slink);
+	buflen = 4 * buflen + 1;
+	if ((buf = malloc(buflen)) == NULL) {
+		warn(NULL);
 		return;
 	}
 
@@ -1562,7 +1565,7 @@ metadata_log(const char *path, const char *type, struct timespec *ts,
 	}
 	while (*p && *p == '/')
 		p++;
-	strsvis(buf, p, VIS_OCTAL, extra);
+	strsnvis(buf, buflen, p, VIS_OCTAL, extra);
 	p = buf;
 	/* Print details. */
 	fprintf(metafp, ".%s%s type=%s", *p ? "/" : "", p, type);
@@ -1572,14 +1575,14 @@ metadata_log(const char *path, const char *type, struct timespec *ts,
 		fprintf(metafp, " gname=%s", group);
 	fprintf(metafp, " mode=%#o", mode);
 	if (slink) {
-		strsvis(buf, slink, VIS_CSTYLE, extra);	/* encode link */
+		strsnvis(buf, buflen, slink, VIS_CSTYLE, extra);
 		fprintf(metafp, " link=%s", buf);
 	}
 	if (*type == 'f') /* type=file */
 		fprintf(metafp, " size=%lld", (long long)size);
 	if (ts != NULL && dopreserve)
 		fprintf(metafp, " time=%lld.%09ld",
-			(long long)ts[1].tv_sec, ts[1].tv_nsec);
+		    (long long)ts[1].tv_sec, ts[1].tv_nsec);
 	if (digestresult && digest)
 		fprintf(metafp, " %s=%s", digest, digestresult);
 	if (fflags)