Fix permission checks for devether
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 20 Jan 2017 17:21:05 +0000 (12:21 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 20 Jan 2017 17:21:05 +0000 (12:21 -0500)
Snoopy on /net/ether0 (the default) was broken if you had a
username/hostowner that wasn't "".  The root cause is Plan 9's nasty
conversion from open modes to rwx with the access[] array.  I happened to
have solved this one before (devpermcheck()), though it took a little to dig
it up.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/net/netif.c

index 23ec45f..4f348a4 100644 (file)
@@ -539,9 +539,8 @@ spinlock_t netlock = SPINLOCK_INITIALIZER;
 
 static int netown(struct netfile *p, char *o, int omode)
 {
-       static int access[] = { 0400, 0200, 0600, 0100 };
        int mode;
-       int t;
+       int rwx;
 
        spin_lock(&netlock);
        if (*p->owner) {
@@ -552,8 +551,8 @@ static int netown(struct netfile *p, char *o, int omode)
                else
                        mode = p->mode << 6;    /* Other */
 
-               t = access[omode & 3];
-               if ((t & mode) == t) {
+               rwx = omode_to_rwx(omode);
+               if ((rwx & mode) == rwx) {
                        spin_unlock(&netlock);
                        return 0;
                } else {