git: 9front

Download patch

ref: 59d8c9ceef595c02421ec0333cb01f0c552beed2
parent: c3f6c125994e5e21d0913cc75126f57c06d254c7
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Mon Jun 25 02:44:23 EDT 2012

cpu: -c command quoting, various cleanups

--- a/sys/src/cmd/cpu.c
+++ b/sys/src/cmd/cpu.c
@@ -136,7 +136,7 @@
 void
 main(int argc, char **argv)
 {
-	char dat[MaxStr], buf[MaxStr], cmd[MaxStr], *p, *err;
+	char dat[MaxStr], buf[MaxStr], cmd[MaxStr], *p, *s, *err;
 	int ac, fd, ms, data;
 	char *av[10];
 
@@ -183,12 +183,11 @@
 		break;
 	case 'c':
 		cflag++;
-		cmd[0] = '!';
-		cmd[1] = '\0';
-		while(p = ARGF()) {
-			strcat(cmd, " ");
-			strcat(cmd, p);
-		}
+		s = cmd;
+		*s++ = '!';
+		*s = 0;
+		while(p = ARGF())
+			s = seprint(s, cmd+sizeof(cmd), " %q", p);
 		break;
 	case 'k':
 		keyspec = smprint("%s %s", keyspec, EARGF(usage()));
@@ -343,7 +342,7 @@
 
 	/* Set environment values for the user */
 	putenv("user", user);
-	sprint(home, "/usr/%s", user);
+	snprint(home, sizeof(home), "/usr/%s", user);
 	putenv("home", home);
 
 	/* Now collect invoking cpu's current directory or possibly a command */
@@ -532,7 +531,7 @@
 	int tries;
 	AuthInfo *ai;
 
-	if(readstr(fd, user, 32) < 0)
+	if(readstr(fd, user, MaxStr) < 0)
 		return -1;
 
 	ai = nil;
@@ -571,12 +570,11 @@
 static int
 p9auth(int fd)
 {
-	uchar key[16];
-	uchar digest[SHA1dlen];
+	uchar key[16], digest[SHA1dlen];
 	char fromclientsecret[21];
 	char fromserversecret[21];
-	int i;
 	AuthInfo *ai;
+	int i;
 
 	procsetname("%s: auth_proxy proto=%q role=client %s",
 		origargs, p9authproto, keyspec);
@@ -583,9 +581,13 @@
 	ai = auth_proxy(fd, auth_getkey, "proto=%q role=client %s", p9authproto, keyspec);
 	if(ai == nil)
 		return -1;
-	memmove(key+4, ai->secret, ai->nsecret);
-	if(ealgs == nil)
+	if(ealgs == nil){
+		auth_freeAI(ai);
 		return fd;
+	}
+	assert(ai->nsecret <= sizeof(key)-4);
+	memmove(key+4, ai->secret, ai->nsecret);
+	auth_freeAI(ai);
 
 	/* exchange random numbers */
 	srand(truerand());
@@ -641,23 +643,25 @@
 static int
 srvp9auth(int fd, char *user)
 {
-	uchar key[16];
-	uchar digest[SHA1dlen];
+	uchar key[16], digest[SHA1dlen];
 	char fromclientsecret[21];
 	char fromserversecret[21];
-	int i;
 	AuthInfo *ai;
+	int i;
 
-	ai = auth_proxy(0, nil, "proto=%q role=server %s", p9authproto, keyspec);
+	ai = auth_proxy(fd, nil, "proto=%q role=server %s", p9authproto, keyspec);
 	if(ai == nil)
 		return -1;
 	if(auth_chuid(ai, nil) < 0)
-		return -1;
-	strecpy(user, user+MaxStr, ai->cuid);
-	memmove(key+4, ai->secret, ai->nsecret);
-
-	if(ealgs == nil)
+		fatal("newns: %r");
+	snprint(user, MaxStr, "%s", ai->cuid);
+	if(ealgs == nil){
+		auth_freeAI(ai);
 		return fd;
+	}
+	assert(ai->nsecret <= sizeof(key)-4);
+	memmove(key+4, ai->secret, ai->nsecret);
+	auth_freeAI(ai);
 
 	/* exchange random numbers */
 	srand(truerand());
--