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)
--
⑨