git: 9front

Download patch

ref: 6a7cee187547ca586ed1c4e137c77f18daf21140
parent: d0fc4fd14634c7509c03e6784d8efeb6679af598
author: Jacob Moody <moody@posixcafe.org>
date: Thu Oct 30 16:01:21 EDT 2025

troff: strcpy -> snprintf where applicable

Fixes some potential overrunes with at least truncation.
Also fix an erroneously placed atoi call back with a strtol.
Original Plan 9 allowed for specifying base using leading characters
in atoi, however 9front changed this behavior long ago to better fit
with standards expectations.

--- a/sys/src/cmd/troff/ext.h
+++ b/sys/src/cmd/troff/ext.h
@@ -15,8 +15,8 @@
 extern	char	mfiles[NMF][NS];
 extern	char	nextf[];
 extern	char	obuf[];
-extern	char	termtab[];
-extern	char	fontdir[];
+extern	char	termtab[NS];
+extern	char	fontdir[NS];
 extern	Font	fonts[MAXFONTS+1];
 extern	char	xbuf[IBUFSZ];
 extern	Offset	apptr;
--- a/sys/src/cmd/troff/n1.c
+++ b/sys/src/cmd/troff/n1.c
@@ -80,12 +80,12 @@
 			break;
 		case 'F':	/* switch font tables from default */
 			if (argv[0][2] != '\0') {
-				strcpy(termtab, &argv[0][2]);
-				strcpy(fontdir, &argv[0][2]);
+				snprintf(termtab, sizeof termtab, "%s", &argv[0][2]);
+				snprintf(fontdir, sizeof fontdir, "%s", &argv[0][2]);
 			} else {
 				argv++; argc--;
-				strcpy(termtab, argv[0]);
-				strcpy(fontdir, argv[0]);
+				snprintf(termtab, sizeof termtab, "%s", argv[0]);
+				snprintf(fontdir, sizeof fontdir, "%s", argv[0]);
 			}
 			break;
 		case 0:
@@ -116,14 +116,13 @@
 				ERROR "Too many macro packages: %s", argv[0] WARN;
 				break;
 			}
-			strcpy(mfiles[nmfi], nextf);
-			strcat(mfiles[nmfi++], &argv[0][2]);
+			snprintf(mfiles[nmfi++], sizeof mfiles[0], "%s%s", nextf,  &argv[0][2]);
 			break;
 		case 'o':
 			getpn(&argv[0][2]);
 			break;
 		case 'T':
-			strcpy(devname, &argv[0][2]);
+			snprintf(devname, sizeof devname, "%s", &argv[0][2]);
 			dotT++;
 			break;
 		case 'a':
@@ -827,7 +826,7 @@
 		nfo -= mflg;
 		done(02);
 	} else
-		strcpy(cfname[ifi],p);
+		snprintf(cfname[ifi], sizeof cfname[0], "%s", p);
 	nfo++;
 	return(0);
 }
@@ -896,7 +895,7 @@
 	nx++;
 	if (nmfi > 0)
 		nmfi--;
-	strcpy(mfiles[nmfi], nextf);
+	snprintf(mfiles[nmfi], sizeof mfiles[0], "%s", nextf);
 	nextfile();
 	nlflg++;
 	ip = 0;
@@ -934,7 +933,7 @@
 		ERROR "can't open file %s", nextf WARN;
 		done(02);
 	}
-	strcpy(cfname[ifi+1], nextf);
+	snprintf(cfname[ifi+1], sizeof cfname[0], "%s", nextf);
 	cfline[ifi] = numtabp[CD].val;		/*hold line counter*/
 	numtabp[CD].val = 0;
 	flushi();
@@ -958,7 +957,7 @@
 		cfline[ifi] = numtabp[CD].val = n - 1;
 	if (!skip())
 		if (getname()) {	/* eats '\n' ? */
-			strcpy(cfname[ifi], nextf);
+			snprintf(cfname[ifi], sizeof cfname[0], "%s", nextf);
 			if (!nonumb)
 				numtabp[CD].val--;
 		}
--- a/sys/src/cmd/troff/n10.c
+++ b/sys/src/cmd/troff/n10.c
@@ -26,7 +26,7 @@
 #ifdef UNICODE
 	if (mbtowc(&wc, s, strlen(s)) > 1) {	/* it's multibyte, */
 		buf[0] = MBchar;
-		strcpy(buf+1, s);
+		snprintf(buf+1, sizeof buf-1, "%s", s);
 		return obuf;
 	}			/* so just hand it back */
 #endif	/*UNICODE*/
@@ -178,12 +178,14 @@
 	setps = n_setps;
 	setwd = n_setwd;
 
-	if ((p = getenv("NROFFTERM")) != 0)
-		strncpy(devname, p, sizeof devname);
+	if ((p = getenv("NROFFTERM")) != 0){
+		snprintf(devname, sizeof devname, "%s", p);
+		free(p);
+	}
 	if (termtab[0] == 0)
-		strcpy(termtab, DWBntermdir);
+		snprintf(termtab, sizeof termtab, "%s", DWBntermdir);
 	if (devname[0] == 0)
-		strncpy(devname, NDEVNAME, sizeof devname);
+		snprintf(devname, sizeof devname, "%s", NDEVNAME);
 	pl = 11*INCH;
 	po = PO;
 	hyf = 0;
--- a/sys/src/cmd/troff/t10.c
+++ b/sys/src/cmd/troff/t10.c
@@ -48,13 +48,13 @@
 	/* open table for device, */
 	/* read in resolution, size info, font info, etc., set params */
 	if ((p = getenv("TYPESETTER")) != 0){
-		strncpy(devname, p, sizeof devname);
-		devname[sizeof devname-1] = 0;
+		snprintf(devname, sizeof devname, "%s", p);
+		free(p);
 	}
 	if (termtab[0] == 0)
-		strcpy(termtab, DWBfontdir);
+		snprintf(termtab, sizeof termtab, "%s", DWBfontdir);
 	if (fontdir[0] == 0)
-		strcpy(fontdir, DWBfontdir);
+		snprintf(fontdir, sizeof fontdir, "%s", DWBfontdir);
 	if (devname[0] == 0)
 		strcpy(devname, TDEVNAME);
 	hyf = 1;
--- a/sys/src/cmd/troff/t11.c
+++ b/sys/src/cmd/troff/t11.c
@@ -127,7 +127,7 @@
 			continue;
 		cmd = toks[0];
 		if (strcmp(cmd, "name") == 0)
-			strcpy(ftemp->longname, toks[1]);
+			snprintf(ftemp->longname, sizeof ftemp->longname, "%s", toks[1]);
 		else if (strcmp(cmd, "special") == 0)
 			ftemp->specfont = 1;
 		else if (strcmp(cmd, "ligatures") == 0)
@@ -146,7 +146,7 @@
 					ch = toks[0];
 					wid = atoi(toks[1]);
 					kern = atoi(toks[2]);
-					code = atoi(toks[3]);  /* dec/oct/hex */
+					code = strtol(toks[3], 0, 0);  /* dec/oct/hex */
 					/* toks[4] is char name */
 				}
 				/*
--- a/sys/src/cmd/troff/t6.c
+++ b/sys/src/cmd/troff/t6.c
@@ -708,9 +708,9 @@
 
 	zapwcache(0);
 	if (truename)
-		strcpy(shortname, truename);
+		snprintf(shortname, sizeof shortname, "%s", truename);
 	else
-		strcpy(shortname, (char *) unpair(f));
+		snprintf(shortname, sizeof shortname, "%s", (char *) unpair(f));
 	if (truename && strrchr(truename, '/')) {	/* .fp 1 R dir/file: use verbatim */
 		sprintf(pathname, "%s", truename);
 		if (fonts[pos].truename)
--