git: 9front

Download patch

ref: 31c7b63fad7edcda27389045b9e962817ccd875e
parent: 6912e44679e15be0b81db4bdde273ebada6fa985
author: cinap_lenrek <cinap_lenrek@rei2.9hal>
date: Tue Feb 7 21:32:03 EST 2012

add Etoolong error string, cleanup genbuf truncation fix

--- a/sys/src/9/port/devenv.c
+++ b/sys/src/9/port/devenv.c
@@ -48,7 +48,7 @@
 	else if(s < eg->nent)
 		e = eg->ent[s];
 
-	if(e == 0 || (strlen(e->name) >= sizeof(up->genbuf))) {
+	if(e == 0 || name && (strlen(e->name) >= sizeof(up->genbuf))) {
 		runlock(eg);
 		return -1;
 	}
@@ -148,7 +148,7 @@
 		error(Eperm);
 
 	if(strlen(name) >= sizeof(up->genbuf))
-		error(Egreg);
+		error(Etoolong);
 
 	omode = openmode(omode);
 	eg = envgrp(c);
--- a/sys/src/9/port/devflash.c
+++ b/sys/src/9/port/devflash.c
@@ -403,7 +403,8 @@
 	}
 	if((fp = empty) == nil)
 		return "partition table full";
-//	fp->name = nil;
+	if(strlen(name)+3 >= sizeof(up->genbuf))
+		return Etoolong;
 	kstrdup(&fp->name, name);
 	if(fp->name == nil)
 		return Enomem;
--- a/sys/src/9/port/devshr.c
+++ b/sys/src/9/port/devshr.c
@@ -304,7 +304,7 @@
 		qlock(&shrslk);
 		for(shr = shrs; shr && s; shr = shr->next)
 			s--;
-		if(shr == nil || (strlen(shr->name) >= sizeof(up->genbuf))){
+		if(shr == nil){
 			qunlock(&shrslk);
 			return -1;
 		}
@@ -323,11 +323,11 @@
 		rlock(&h->lock);
 		for(m = h->mount; m && s; m = m->next)
 			s--;
-		mpt = tompt(m);
-		if(m == nil || (strlen(mpt->name) >= sizeof(up->genbuf))){
+		if(m == nil){
 			runlock(&h->lock);
 			return -1;
 		}
+		mpt = tompt(m);
 		kstrcpy(up->genbuf, mpt->name, sizeof up->genbuf);
 		devdir(c, shrqid(Qcmpt, mpt->id), up->genbuf, 0, mpt->owner, mpt->perm, dp);
 		runlock(&h->lock);
@@ -461,7 +461,7 @@
 		if((perm & DMDIR) == 0 || openmode(omode) != OREAD)
 			error(Eperm);
 		if(strlen(name) >= sizeof(up->genbuf))
-			error(Egreg);
+			error(Etoolong);
 		qlock(&shrslk);
 		if(waserror()){
 			qunlock(&shrslk);
@@ -499,7 +499,7 @@
 		devpermcheck(shr->owner, shr->perm, ORDWR);
 
 		if(strlen(name) >= sizeof(up->genbuf))
-			error(Egreg);
+			error(Etoolong);
 
 		h = &shr->umh;
 		wlock(&h->lock);
@@ -657,7 +657,7 @@
 		if(strchr(d.name, '/') != nil)
 			error(Ebadchar);
 		if(strlen(d.name) >= sizeof(up->genbuf))
-			error(Egreg);
+			error(Etoolong);
 		kstrdup(&ent->name, d.name);
 	}
 	poperror();
--- a/sys/src/9/port/devsrv.c
+++ b/sys/src/9/port/devsrv.c
@@ -49,7 +49,7 @@
 		for(sp = srv; sp && s; sp = sp->link)
 			s--;
 	}
-	if(sp == 0 || (strlen(sp->name) >= sizeof(up->genbuf))) {
+	if(sp == 0 || name && (strlen(sp->name) >= sizeof(up->genbuf))) {
 		qunlock(&srvlk);
 		return -1;
 	}
@@ -148,7 +148,7 @@
 		error(Eperm);
 
 	if(strlen(name) >= sizeof(up->genbuf))
-		error(Egreg);
+		error(Etoolong);
 
 	sp = smalloc(sizeof *sp);
 	sname = smalloc(strlen(name)+1);
@@ -266,7 +266,7 @@
 		if(strchr(d.name, '/') != nil)
 			error(Ebadchar);
 		if(strlen(d.name) >= sizeof(up->genbuf))
-			error(Egreg);
+			error(Etoolong);
 		kstrdup(&sp->name, d.name);
 	}
 	qunlock(&srvlk);
@@ -307,7 +307,7 @@
 	char buf[32];
 
 	if(n >= sizeof buf)
-		error(Egreg);
+		error(Etoobig);
 	memmove(buf, va, n);	/* so we can NUL-terminate */
 	buf[n] = 0;
 	fd = strtoul(buf, 0, 0);
--- a/sys/src/9/port/error.h
+++ b/sys/src/9/port/error.h
@@ -51,3 +51,4 @@
 extern char Ecmdargs[];		/* wrong #args in control message */
 extern char Ebadip[];		/* bad ip address syntax */
 extern char Edirseek[];		/* seek in directory */
+extern char Etoolong[];		/* name too long */
--