git: 9front

Download patch

ref: 40db2561a1b6b9c083f12ba60ebe26e158cb35d6
parent: 2610761a6262e22a70a9becf6726fe4163aa620f
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Mon Dec 12 07:16:35 EST 2011

cwfs: simplify checkname, allow space character

--- a/sys/src/cmd/cwfs/9p1.c
+++ b/sys/src/cmd/cwfs/9p1.c
@@ -659,15 +659,8 @@
 		goto out;
 	}
 	accessdir(p, d, FREAD, f->uid);
-	if(!strncmp(in->name, ".", sizeof(in->name)) ||
-	   !strncmp(in->name, "..", sizeof(in->name))) {
-		ou->err = Edot;
+	if(ou->err = checkname(in->name))
 		goto out;
-	}
-	if(checkname(in->name)) {
-		ou->err = Ename;
-		goto out;
-	}
 	addr1 = 0;
 	slot1 = 0;	/* set */
 	for(addr=0;; addr++) {
@@ -1393,8 +1386,11 @@
 	 * must have write permission in parent
 	 */
 	if (strncmp(d->name, xd.name, sizeof(d->name)) != 0) {
-		if (checkname(xd.name) || !d1 ||
-		    strcmp(xd.name, ".") == 0 || strcmp(xd.name, "..") == 0) {
+		if(ou->err = checkname(xd.name))
+			goto out;
+
+		/* rename root? */
+		if(!d1){
 			ou->err = Ename;
 			goto out;
 		}
--- a/sys/src/cmd/cwfs/9p2.c
+++ b/sys/src/cmd/cwfs/9p2.c
@@ -111,29 +111,6 @@
 }
 
 static int
-checkname9p2(char* name)
-{
-	char *p;
-
-	/*
-	 * Return error or 0 if OK.
-	 */
-	if(name == nil || *name == 0)
-		return Ename;
-
-	for(p = name; *p != 0; p++){
-		if(p-name >= NAMELEN-1)
-			return Etoolong;
-		if((*p & 0xFF) <= 040)
-			return Ename;
-	}
-	if(strcmp(name, ".") == 0 || strcmp(name, "..") == 0)
-		return Edot;
-
-	return 0;
-}
-
-static int
 version(Chan* chan, Fcall* f, Fcall* r)
 {
 	if(chan->protocol != nil)
@@ -825,7 +802,7 @@
 	 * Check the name is valid (and will fit in an old
 	 * directory entry for the moment).
 	 */
-	if(error = checkname9p2(f->name))
+	if(error = checkname(f->name))
 		goto out;
 
 	addr1 = 0;
@@ -1547,7 +1524,7 @@
 	 * Check .name is valid and different to the current.
 	 */
 	if(dir.name != nil && *dir.name != '\0'){
-		if(error = checkname9p2(dir.name))
+		if(error = checkname(dir.name))
 			goto out;
 		if(strncmp(dir.name, d->name, NAMELEN))
 			op = 1;
--- a/sys/src/cmd/cwfs/sub.c
+++ b/sys/src/cmd/cwfs/sub.c
@@ -534,19 +534,18 @@
 {
 	int i, c;
 
-	for(i=0; i<NAMELEN; i++) {
-		c = *n & 0xff;
-		if(c == 0) {
-			if(i == 0)
-				return 1;
-			memset(n, 0, NAMELEN-i);
+	if(n == 0 || *n == 0)
+		return Ename;
+	if(*n == '.' && (n[1] == 0 || (n[1] == '.' && n[2] == 0)))
+		return Edot;
+	for(i=1; i<NAMELEN; i++) {
+		c = n[i] & 0xff;
+		if(c == 0)
 			return 0;
-		}
-		if(c <= 040)
-			return 1;
-		n++;
+		if(c < 040)
+			return Ename;
 	}
-	return 1;	/* too long */
+	return Etoolong;
 }
 
 void
--