M port/chan.c => port/chan.c +4 -3
@@ 865,7 865,7 @@ namec(char *name, int amode, int omode, ulong perm)
cclose(cc);
nexterror();
}
- nameok(elem);
+ nameok(elem, 0);
if(walk(&cc, elem, 1) == 0){
poperror();
cclose(c);
@@ 949,14 949,15 @@ char isfrog[256]={
};
void
-nameok(char *elem)
+nameok(char *elem, int slashok)
{
char *eelem;
eelem = elem+NAMELEN;
while(*elem) {
if(isfrog[*(uchar*)elem])
- error(Ebadchar);
+ if(!slashok || *elem!='/')
+ error(Ebadchar);
elem++;
if(elem >= eelem)
error(Efilename);
M port/portfns.h => port/portfns.h +1 -1
@@ 169,7 169,7 @@ long mntwrite9p(Chan*, void*, long, vlong);
void mountfree(Mount*);
ulong msize(void*);
Chan* namec(char*, int, int, ulong);
-void nameok(char*);
+void nameok(char*, int);
#define nelem(x) (sizeof(x)/sizeof(x[0]))
Chan* newchan(void);
Mount* newmount(Mhead*, Chan*, int, char*);
M port/sysfile.c => port/sysfile.c +3 -3
@@ 624,7 624,7 @@ bindmount(ulong *arg, int ismount)
bogus.spec = (char*)arg[3];
if(waserror())
error(Ebadspec);
- nameok(bogus.spec);
+ nameok(bogus.spec, 1);
poperror();
ret = devno('M', 0);
@@ 757,7 757,7 @@ syswstat(ulong *arg)
Chan *c;
validaddr(arg[1], DIRLEN, 0);
- nameok((char*)arg[1]);
+ nameok((char*)arg[1], 0);
validaddr(arg[0], 1, 0);
c = namec((char*)arg[0], Aaccess, 0, 0);
if(waserror()){
@@ 776,7 776,7 @@ sysfwstat(ulong *arg)
Chan *c;
validaddr(arg[1], DIRLEN, 0);
- nameok((char*)arg[1]);
+ nameok((char*)arg[1], 0);
c = fdtochan(arg[0], -1, 1, 1);
if(waserror()) {
cclose(c);