git: 9front

Download patch

ref: 98b38a86e9d1102edf065cd7d4f8c58618675b39
parent: 94803b9c72f72d41e54a3f9fd4b67cf0674e8f9a
author: ftrvxmtrx <devnull@localhost>
date: Sat May 3 19:38:17 EDT 2014

wc: simplify and avoid buffer overflow on long filenames

--- a/sys/src/cmd/wc.c
+++ b/sys/src/cmd/wc.c
@@ -37,7 +37,7 @@
 		pchar = 1;
 	}
 	if(argc==0)
-		count(0, 0);
+		count(0, nil);
 	else{
 		for(i=0;i<argc;i++){
 			f=open(argv[i], OREAD);
@@ -63,33 +63,23 @@
 void
 report(uvlong nline, uvlong nword, uvlong nrune, uvlong nbadr, uvlong nchar, char *fname)
 {
-	char line[1024], word[128];
+	char line[128], *e;
 	line[0] = '\0';
-	if(pline){
-		sprint(word, " %7llud", nline);
-		strcat(line, word);
-	}
-	if(pword){
-		sprint(word, " %7llud", nword);
-		strcat(line, word);
-	}
-	if(prune){
-		sprint(word, " %7llud", nrune);
-		strcat(line, word);
-	}
-	if(pbadr){
-		sprint(word, " %7llud", nbadr);
-		strcat(line, word);
-	}
-	if(pchar){
-		sprint(word, " %7llud", nchar);
-		strcat(line, word);
-	}
-	if(fname){
-		sprint(word, " %s",   fname);
-		strcat(line, word);
-	}
-	print("%s\n", line+1);
+	e = line;
+	if(pline)
+		e += sprint(e, " %7llud", nline);
+	if(pword)
+		e += sprint(e, " %7llud", nword);
+	if(prune)
+		e += sprint(e, " %7llud", nrune);
+	if(pbadr)
+		e += sprint(e, " %7llud", nbadr);
+	if(pchar)
+		sprint(e, " %7llud", nchar);
+	if(fname)
+		print("%s %s\n", line+1, fname);
+	else
+		print("%s\n", line+1);
 }
 /*
  * How it works.  Start in statesp.  Each time we read a character,
--