devproc: change user from char* to struct username
authorFergus Simpson <afergs@google.com>
Tue, 10 Jan 2017 22:29:29 +0000 (14:29 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 18 Jan 2017 18:27:54 +0000 (13:27 -0500)
A process's username is now stored in a struct as char* so that it can
be easily paired with a spinlock. The spinlock is currently only used to
protect writes. The eve variable has also been changed from a char* to
the new username struct.

A helper for setting a username has been added. It uses a spinlock to
protect writes, but not reads. It performs a backward write so if any
process reads the value while it's been written, the result will be an
empty string.

All reads and writes to (struct proc *)->user have been updated to
either read (struct proc *)->user.name directly or write to it using the
new helper function, respectively. Where the old user char * was passed
on, it was checked that the pointer was only used for reading. The same
has been done for all uses of eve.

Change-Id: Ia573cccb6f59c2ecc7c84ef9013fa4d74cad2885
Signed-off-by: Fergus Simpson <afergs@google.com>
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
20 files changed:
kern/drivers/dev/acpi.c
kern/drivers/dev/alarm.c
kern/drivers/dev/capability.c
kern/drivers/dev/cons.c
kern/drivers/dev/mnt.c
kern/drivers/dev/pci.c
kern/drivers/dev/pipe.c
kern/drivers/dev/proc.c
kern/drivers/dev/root.c
kern/drivers/dev/sd.c
kern/drivers/dev/srv.c
kern/include/env.h
kern/include/ns.h
kern/include/process.h
kern/src/env.c
kern/src/net/devip.c
kern/src/net/netif.c
kern/src/net/plan9.c
kern/src/ns/dev.c
kern/src/process.c

index a09a355..5af10c4 100644 (file)
@@ -1654,7 +1654,8 @@ static int acpigen(struct chan *c, char *name, struct dirtab *tab, int ntab,
 
        if (i == DEVDOTDOT) {
                assert((c->qid.path & QIndexMask) == Qdir);
-               devdir(c, a->parent->qid, a->parent->name, 0, eve, DMDIR|0555, dp);
+               devdir(c, a->parent->qid, a->parent->name, 0, eve.name, DMDIR | 0555,
+                      dp);
                return 1;
        }
        return devgen(c, name, a->cdirs, a->nchildren + NQtypes, i, dp);
index 31a3670..077c806 100644 (file)
@@ -90,7 +90,7 @@ static char *devname(void)
 #define QID2A(q) ((struct proc_alarm*)KADDR(((q).path >> ADDR_SHIFT)))
 #define TYPE(q) ((q).path & ((1 << ADDR_SHIFT) - 1))
 #define QID(ptr, type) ((PADDR(ptr) << ADDR_SHIFT) | type)
-extern char *eve;
+extern struct username eve;
 
 static void alarm_release(struct kref *kref)
 {
@@ -152,7 +152,7 @@ static int alarmgen(struct chan *c, char *entry_name,
        /* Whether we're in one dir or at the top, .. still takes us to the top. */
        if (s == DEVDOTDOT) {
                mkqid(&q, Qtopdir, 0, QTDIR);
-               devdir(c, q, devname(), 0, eve, 0555, dp);
+               devdir(c, q, devname(), 0, eve.name, 0555, dp);
                return 1;
        }
        switch (TYPE(c->qid)) {
@@ -161,7 +161,7 @@ static int alarmgen(struct chan *c, char *entry_name,
                         * alarm dirs at the top level */
                        if (s == 0) {
                                mkqid(&q, Qclone, 0, QTFILE);
-                               devdir(c, q, "clone", 0, eve, 0666, dp);
+                               devdir(c, q, "clone", 0, eve.name, 0666, dp);
                                return 1;
                        }
                        s--;    /* 1 -> 0th element, 2 -> 1st element, etc */
@@ -201,7 +201,7 @@ static int alarmgen(struct chan *c, char *entry_name,
                        }
                        snprintf(get_cur_genbuf(), GENBUF_SZ, "a%d", a_i->id);
                        mkqid(&q, QID(a_i, Qalarmdir), 0, QTDIR);
-                       devdir(c, q, get_cur_genbuf(), 0, eve, 0555, dp);
+                       devdir(c, q, get_cur_genbuf(), 0, eve.name, 0555, dp);
                        spin_unlock(&p->alarmset.lock);
                        return 1;
                case Qalarmdir:
@@ -210,19 +210,19 @@ static int alarmgen(struct chan *c, char *entry_name,
                        switch (s) {
                                case Qctl:
                                        mkqid(&q, QID(QID2A(c->qid), Qctl), 0, QTFILE);
-                                       devdir(c, q, "ctl", 0, eve, 0666, dp);
+                                       devdir(c, q, "ctl", 0, eve.name, 0666, dp);
                                        return 1;
                                case Qtimer:
                                        mkqid(&q, QID(QID2A(c->qid), Qtimer), 0, QTFILE);
-                                       devdir(c, q, "timer", 0, eve, 0666, dp);
+                                       devdir(c, q, "timer", 0, eve.name, 0666, dp);
                                        return 1;
                                case Qperiod:
                                        mkqid(&q, QID(QID2A(c->qid), Qperiod), 0, QTFILE);
-                                       devdir(c, q, "period", 0, eve, 0666, dp);
+                                       devdir(c, q, "period", 0, eve.name, 0666, dp);
                                        return 1;
                                case Qcount:
                                        mkqid(&q, QID(QID2A(c->qid), Qcount), 0, QTFILE);
-                                       devdir(c, q, "count", 0, eve, 0666, dp);
+                                       devdir(c, q, "count", 0, eve.name, 0666, dp);
                                        return 1;
                        }
                        return -1;
@@ -238,19 +238,19 @@ static int alarmgen(struct chan *c, char *entry_name,
                         * for the a directory by path and fail.  Then it will manually
                         * build the stat output (check the -1 case in devstat). */
                case Qclone:
-                       devdir(c, c->qid, "clone", 0, eve, 0666, dp);
+                       devdir(c, c->qid, "clone", 0, eve.name, 0666, dp);
                        return 1;
                case Qctl:
-                       devdir(c, c->qid, "ctl", 0, eve, 0666, dp);
+                       devdir(c, c->qid, "ctl", 0, eve.name, 0666, dp);
                        return 1;
                case Qtimer:
-                       devdir(c, c->qid, "timer", 0, eve, 0666, dp);
+                       devdir(c, c->qid, "timer", 0, eve.name, 0666, dp);
                        return 1;
                case Qperiod:
-                       devdir(c, c->qid, "period", 0, eve, 0666, dp);
+                       devdir(c, c->qid, "period", 0, eve.name, 0666, dp);
                        return 1;
                case Qcount:
-                       devdir(c, c->qid, "count", 0, eve, 0666, dp);
+                       devdir(c, c->qid, "count", 0, eve.name, 0666, dp);
                        return 1;
        }
        return -1;
index ca7fbfb..3c511ae 100644 (file)
@@ -106,7 +106,7 @@ static struct chan *capopen(struct chan *c, int omode)
        switch ((uint32_t)c->qid.path) {
        case Qhash:
                if (!iseve())
-                       error(EPERM, "Permission denied: only eve() can open Qhash");
+                       error(EPERM, "Permission denied: only eve can open Qhash");
                break;
        }
 
@@ -256,20 +256,20 @@ static long capwrite(struct chan *c, void *va, long n, int64_t m)
                        *to++ = 0;
                        panic("todo");
                        /*
-                       if (strcmp(from, up->user) != 0)
+                       if (strcmp(from, current->user.name) != 0)
                                error(EINVAL, "capability must match user");
                        */
                }
 
                /* set user id */
                // TODO: make user a char *, not a fixed array.
-               //kstrdup(&current->user, to);
+               //kstrdup(&current->user.name to);
                // In the original user names were NULL-terminated; ensure
                // that is still the case.
-               if (strlen(to) > sizeof(current->user)-1)
-                       error(EINVAL, "New user name is > %d bytes", sizeof(current->user));
-               memset(current->user, 0, sizeof(current->user));
-               strncpy(current->user, to, sizeof(current->user));
+               if (strlen(to) > sizeof(current->user.name) - 1)
+                       error(EINVAL, "New user name is > %d bytes",
+                             sizeof(current->user.name) - 1);
+               proc_set_username(current, to);
                //up->basepri = PriNormal;
 
 
index d0d2ff2..bdd464d 100644 (file)
@@ -19,6 +19,7 @@
 #include <error.h>
 #include <sys/queue.h>
 #include <event.h>
+#include <env.h>
 #include <ros/procinfo.h>
 
 #if 0
@@ -60,12 +61,12 @@ void logbuf(int c)
 int iseve(void)
 {
 #if 0
-       return strcmp(eve, o->user) == 0;
+       return strcmp(eve.name, o->user.name) == 0;
 #endif
        return 1;
 }
 
-char *eve = "eve";
+struct username eve = {.name = "eve", .name_lock = SPINLOCK_INITIALIZER};
 char hostdomain[256] = "akaros.org";
 
 static struct {
@@ -725,7 +726,7 @@ static int consstat(struct chan *c, uint8_t *dp, int n)
                tab = &consdir[Qstdin];
                perm = tab->perm;
                perm |= qreadable(cons_q) ? DMREADABLE : 0;
-               devdir(c, tab->qid, tab->name, qlen(cons_q), eve, perm, &dir);
+               devdir(c, tab->qid, tab->name, qlen(cons_q), eve.name, perm, &dir);
                return dev_make_stat(c, &dir, dp, n);
        default:
                return devstat(c, dp, n, consdir, ARRAY_SIZE(consdir), devgen);
@@ -906,13 +907,13 @@ static long consread(struct chan *c, void *buf, long n, int64_t off)
                        return readbintime(buf, n);
 
                case Qhostowner:
-                       return consreadstr((uint32_t) offset, buf, n, eve);
+                       return consreadstr((uint32_t) offset, buf, n, eve.name);
 
                case Qhostdomain:
                        return consreadstr((uint32_t) offset, buf, n, hostdomain);
 
                case Quser:
-                       return consreadstr((uint32_t) offset, buf, n, current->user);
+                       return consreadstr((uint32_t) offset, buf, n, current->user.name);
 
                case Qnull:
                        return 0;
index f1b98f0..8f946a3 100644 (file)
@@ -325,7 +325,7 @@ struct chan *mntauth(struct chan *c, char *spec)
 
        r->request.type = Tauth;
        r->request.afid = c->fid;
-       r->request.uname = current->user;
+       r->request.uname = current->user.name;
        r->request.aname = spec;
        mountrpc(m, r);
 
@@ -391,7 +391,7 @@ static struct chan *mntattach(char *muxattach)
                r->request.afid = NOFID;
        else
                r->request.afid = bogus.authchan->fid;
-       r->request.uname = current->user;
+       r->request.uname = current->user.name;
        r->request.aname = bogus.spec;
        mountrpc(m, r);
 
index dcb0b8b..36d1aac 100644 (file)
@@ -57,12 +57,12 @@ static int pcidirgen(struct chan *c, int t, int tbdf, struct dir *dp)
        case Qpcictl:
                snprintf(get_cur_genbuf(), GENBUF_SZ, "%d.%d.%dctl",
                         BUSBNO(tbdf), BUSDNO(tbdf), BUSFNO(tbdf));
-               devdir(c, q, get_cur_genbuf(), 0, eve, 0444, dp);
+               devdir(c, q, get_cur_genbuf(), 0, eve.name, 0444, dp);
                return 1;
        case Qpciraw:
                snprintf(get_cur_genbuf(), GENBUF_SZ, "%d.%d.%draw",
                         BUSBNO(tbdf), BUSDNO(tbdf), BUSFNO(tbdf));
-               devdir(c, q, get_cur_genbuf(), 128, eve, 0664, dp);
+               devdir(c, q, get_cur_genbuf(), 128, eve.name, 0664, dp);
                return 1;
        }
        return -1;
@@ -82,7 +82,7 @@ pcigen(struct chan *c, char *_1, struct dirtab *_2, int _3, int s,
                        q = (struct qid) {
                                QID(0, Qtopdir), 0, QTDIR};
                        snprintf(get_cur_genbuf(), GENBUF_SZ, "#%s", pcidevtab.name);
-                       devdir(c, q, get_cur_genbuf(), 0, eve, 0555, dp);
+                       devdir(c, q, get_cur_genbuf(), 0, eve.name, 0555, dp);
                        return 1;
                }
                return devgen(c, NULL, topdir, ARRAY_SIZE(topdir), s, dp);
@@ -91,7 +91,7 @@ pcigen(struct chan *c, char *_1, struct dirtab *_2, int _3, int s,
                        q = (struct qid) {
                                QID(0, Qtopdir), 0, QTDIR};
                        snprintf(get_cur_genbuf(), GENBUF_SZ, "#%s", pcidevtab.name);
-                       devdir(c, q, get_cur_genbuf(), 0, eve, 0555, dp);
+                       devdir(c, q, get_cur_genbuf(), 0, eve.name, 0555, dp);
                        return 1;
                }
                STAILQ_FOREACH(p, &pci_devices, all_dev) {
index 58a3217..be2593b 100644 (file)
@@ -125,7 +125,7 @@ static struct chan *pipeattach(char *spec)
        if (p->pipedir == 0)
                error(ENOMEM, ERROR_FIXME);
        memmove(p->pipedir, pipedir, sizeof(pipedir));
-       kstrdup(&p->user, current->user);
+       kstrdup(&p->user, current->user.name);
        kref_init(&p->ref, pipe_release, 1);
        qlock_init(&p->qlock);
 
@@ -162,7 +162,7 @@ pipegen(struct chan *c, char *unused,
        Pipe *p;
 
        if (i == DEVDOTDOT) {
-               devdir(c, c->qid, devname(), 0, eve, 0555, dp);
+               devdir(c, c->qid, devname(), 0, eve.name, 0555, dp);
                return 1;
        }
        i++;    /* skip . */
@@ -185,7 +185,7 @@ pipegen(struct chan *c, char *unused,
        qid.path = NETQID(id, tab->qid.path);
        qid.vers = 0;
        qid.type = QTFILE;
-       devdir(c, qid, tab->name, len, eve, tab->perm, dp);
+       devdir(c, qid, tab->name, len, eve.name, tab->perm, dp);
        return 1;
 }
 
@@ -229,20 +229,20 @@ static int pipestat(struct chan *c, uint8_t * db, int n)
        switch (type) {
                case Qdir:
                case Qctl:
-                       devdir(c, c->qid, tab[type].name, tab[type].length, eve,
+                       devdir(c, c->qid, tab[type].name, tab[type].length, eve.name,
                               tab[type].perm, &dir);
                        break;
                case Qdata0:
                        perm = tab[1].perm;
                        perm |= qreadable(p->q[0]) ? DMREADABLE : 0;
                        perm |= qwritable(p->q[1]) ? DMWRITABLE : 0;
-                       devdir(c, c->qid, tab[1].name, qlen(p->q[0]), eve, perm, &dir);
+                       devdir(c, c->qid, tab[1].name, qlen(p->q[0]), eve.name, perm, &dir);
                        break;
                case Qdata1:
                        perm = tab[2].perm;
                        perm |= qreadable(p->q[1]) ? DMREADABLE : 0;
                        perm |= qwritable(p->q[0]) ? DMWRITABLE : 0;
-                       devdir(c, c->qid, tab[2].name, qlen(p->q[1]), eve, perm, &dir);
+                       devdir(c, c->qid, tab[2].name, qlen(p->q[1]), eve.name, perm, &dir);
                        break;
                default:
                        panic("pipestat");
@@ -488,7 +488,7 @@ static int pipewstat(struct chan *c, uint8_t *dp, int n)
        if (c->qid.type & QTDIR)
                error(EPERM, ERROR_FIXME);
        p = c->aux;
-       if (strcmp(current->user, p->user) != 0)
+       if (strcmp(current->user.name, p->user) != 0)
                error(EPERM, ERROR_FIXME);
        d = kzmalloc(sizeof(*d) + n, 0);
        if (waserror()) {
index 28c0522..2c406e2 100644 (file)
@@ -222,7 +222,7 @@ procgen(struct chan *c, char *name, struct dirtab *tab, int unused, int s,
        uint32_t path, perm, len;
        if (s == DEVDOTDOT) {
                mkqid(&qid, Qdir, 0, QTDIR);
-               devdir(c, qid, devname(), 0, eve, 0555, dp);
+               devdir(c, qid, devname(), 0, eve.name, 0555, dp);
                return 1;
        }
 
@@ -230,20 +230,20 @@ procgen(struct chan *c, char *name, struct dirtab *tab, int unused, int s,
                if (s == 0) {
                        strlcpy(get_cur_genbuf(), "trace", GENBUF_SZ);
                        mkqid(&qid, Qtrace, -1, QTFILE);
-                       devdir(c, qid, get_cur_genbuf(), 0, eve, 0444, dp);
+                       devdir(c, qid, get_cur_genbuf(), 0, eve.name, 0444, dp);
                        return 1;
                }
                if (s == 1) {
                        strlcpy(get_cur_genbuf(), "tracepids", GENBUF_SZ);
                        mkqid(&qid, Qtracepids, -1, QTFILE);
-                       devdir(c, qid, get_cur_genbuf(), 0, eve, 0444, dp);
+                       devdir(c, qid, get_cur_genbuf(), 0, eve.name, 0444, dp);
                        return 1;
                }
                if (s == 2) {
                        p = current;
                        strlcpy(get_cur_genbuf(), "self", GENBUF_SZ);
                        mkqid(&qid, (p->pid + 1) << QSHIFT, p->pid, QTDIR);
-                       devdir(c, qid, get_cur_genbuf(), 0, p->user, DMDIR | 0555, dp);
+                       devdir(c, qid, get_cur_genbuf(), 0, p->user.name, DMDIR | 0555, dp);
                        return 1;
                }
                s -= 3;
@@ -278,20 +278,20 @@ procgen(struct chan *c, char *name, struct dirtab *tab, int unused, int s,
                        return -1;
                }
                mkqid(&qid, (s + 1) << QSHIFT, pid, QTDIR);
-               devdir(c, qid, get_cur_genbuf(), 0, p->user, DMDIR | 0555, dp);
+               devdir(c, qid, get_cur_genbuf(), 0, p->user.name, DMDIR | 0555, dp);
                proc_decref(p);
                return 1;
        }
        if (c->qid.path == Qtrace) {
                strlcpy(get_cur_genbuf(), "trace", GENBUF_SZ);
                mkqid(&qid, Qtrace, -1, QTFILE);
-               devdir(c, qid, get_cur_genbuf(), 0, eve, 0444, dp);
+               devdir(c, qid, get_cur_genbuf(), 0, eve.name, 0444, dp);
                return 1;
        }
        if (c->qid.path == Qtracepids) {
                strlcpy(get_cur_genbuf(), "tracepids", GENBUF_SZ);
                mkqid(&qid, Qtracepids, -1, QTFILE);
-               devdir(c, qid, get_cur_genbuf(), 0, eve, 0444, dp);
+               devdir(c, qid, get_cur_genbuf(), 0, eve.name, 0444, dp);
                return 1;
        }
        if (s >= ARRAY_SIZE(procdir))
@@ -330,7 +330,7 @@ procgen(struct chan *c, char *name, struct dirtab *tab, int unused, int s,
 #endif
 
        mkqid(&qid, path | tab->qid.path, c->qid.vers, QTFILE);
-       devdir(c, qid, tab->name, len, p->user, perm, dp);
+       devdir(c, qid, tab->name, len, p->user.name, perm, dp);
        proc_decref(p);
        return 1;
 }
@@ -413,7 +413,7 @@ static void nonone(struct proc *p)
 #if 0
        if (p == up)
                return;
-       if (strcmp(current->user, "none") != 0)
+       if (strcmp(current->user.name, "none") != 0)
                return;
        if (iseve())
                return;
@@ -693,18 +693,18 @@ static int procwstat(struct chan *c, uint8_t * db, int n)
        if (p->pid != PID(c->qid))
                error(ESRCH, ERROR_FIXME);
 
-       if (strcmp(current->user, p->user) != 0 && strcmp(current->user, eve) != 0)
+       if (strcmp(current->user.name, p->user.name) != 0 && !iseve())
                error(EPERM, ERROR_FIXME);
 
        d = kzmalloc(sizeof(struct dir) + n, MEM_WAIT);
        n = convM2D(db, n, &d[0], (char *)&d[1]);
        if (n == 0)
                error(ENOENT, ERROR_FIXME);
-       if (!emptystr(d->uid) && strcmp(d->uid, p->user) != 0) {
-               if (strcmp(current->user, eve) != 0)
+       if (!emptystr(d->uid) && strcmp(d->uid, p->user.name) != 0) {
+               if (!iseve())
                        error(EPERM, ERROR_FIXME);
                else
-                       kstrdup(&p->user, d->uid);
+                       proc_set_username(p, d->uid);
        }
        if (d->mode != ~0UL)
                p->procmode = d->mode & 0777;
index de39473..12f35e5 100644 (file)
@@ -268,7 +268,7 @@ rootgen(struct chan *c, char *name,
                p = rootdata[c->qid.path].dotdot;
                c->qid = roottab[p].qid;
                name = roottab[p].name;
-               devdir(c, c->qid, name, 0, eve, 0777, dp);
+               devdir(c, c->qid, name, 0, eve.name, 0777, dp);
                return 1;
        }
 
@@ -277,7 +277,7 @@ rootgen(struct chan *c, char *name,
                if (s)
                        return -1;
                tab = &roottab[c->qid.path];
-               devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp);
+               devdir(c, tab->qid, tab->name, tab->length, eve.name, tab->perm, dp);
                return 1;
        }
 
@@ -289,7 +289,8 @@ rootgen(struct chan *c, char *name,
                for (iter = 0, i = rootdata[path].child; /* break */; iter++) {
                        if (strncmp(tab->name, name, KNAMELEN) == 0) {
                                printd("Rootgen returns 1 for %s\n", name);
-                               devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp);
+                               devdir(c, tab->qid, tab->name, tab->length, eve.name, tab->perm,
+                                      dp);
                                printd("return 1 with [%d, %d, %d]\n", dp->qid.path,
                                       dp->qid.vers, dp->qid.type);
                                return 1;
@@ -326,7 +327,7 @@ rootgen(struct chan *c, char *name,
                return -1;
        }
        printd("root scan find returns path %p name %s\n", tab->qid.path, tab->name);
-       devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp);
+       devdir(c, tab->qid, tab->name, tab->length, eve.name, tab->perm, dp);
        return 1;
 }
 
index 84a1092..6022cc9 100644 (file)
@@ -158,7 +158,7 @@ void sdaddpart(struct sdunit *unit, char *name, uint64_t start, uint64_t end)
        pp->start = start;
        pp->end = end;
        kstrdup(&pp->sdperm.name, name);
-       kstrdup(&pp->sdperm.user, eve);
+       kstrdup(&pp->sdperm.user, eve.name);
        pp->sdperm.perm = 0640;
        pp->valid = 1;
 }
@@ -181,7 +181,7 @@ static void sddelpart(struct sdunit *unit, char *name)
                error(EINVAL, "%s: %d > npart %d", __func__, i, unit->npart);
 
        /* TODO: Implement permission checking and raise errors as appropriate. */
-       // if (strcmp(up->user, pp->SDperm.user) && !iseve())
+       // if (strcmp(current->user.name, pp->SDperm.user) && !iseve())
                // error(Eperm);
 
        pp->valid = 0;
@@ -327,7 +327,7 @@ static struct sdunit *sdgetunit(struct sdev *sdev, int subno)
 
                snprintf(buf, sizeof(buf), "%s%d", sdev->name, subno);
                kstrdup(&unit->sdperm.name, buf);
-               kstrdup(&unit->sdperm.user, eve);
+               kstrdup(&unit->sdperm.user, eve.name);
                unit->sdperm.perm = 0555;
                unit->subno = subno;
                unit->dev = sdev;
@@ -447,7 +447,7 @@ static int sd2gen(struct chan *c, int i, struct dir *dp)
                      unit->vers, QTFILE);
                perm = &unit->ctlperm;
                if (emptystr(perm->user)) {
-                       kstrdup(&perm->user, eve);
+                       kstrdup(&perm->user, eve.name);
                        perm->perm = 0644; /* nothing secret in ctl */
                }
                devdir(c, q, "ctl", 0, perm->user, perm->perm, dp);
@@ -459,7 +459,7 @@ static int sd2gen(struct chan *c, int i, struct dir *dp)
                      unit->vers, QTFILE);
                perm = &unit->rawperm;
                if (emptystr(perm->user)) {
-                       kstrdup(&perm->user, eve);
+                       kstrdup(&perm->user, eve.name);
                        perm->perm = DMEXCL | 0600;
                }
                devdir(c, q, "raw", 0, perm->user, perm->perm, dp);
@@ -472,7 +472,7 @@ static int sd2gen(struct chan *c, int i, struct dir *dp)
                mkqid(&q, QID(DEV(c->qid), UNIT(c->qid), PART(c->qid), Qpart),
                      unit->vers + pp->vers, QTFILE);
                if (emptystr(pp->sdperm.user))
-                       kstrdup(&pp->sdperm.user, eve);
+                       kstrdup(&pp->sdperm.user, eve.name);
                devdir(c, q, pp->sdperm.name, l, pp->sdperm.user, pp->sdperm.perm, dp);
                rv = 1;
                break;
@@ -489,7 +489,7 @@ static int sd1gen(struct chan *c, int i, struct dir *dp)
        switch (i) {
        case Qtopctl:
                mkqid(&q, QID(0, 0, 0, Qtopctl), 0, QTFILE);
-               devdir(c, q, "sdctl", 0, eve, 0644, dp); /* no secrets */
+               devdir(c, q, "sdctl", 0, eve.name, 0644, dp); /* no secrets */
                return 1;
        }
        return -1;
@@ -510,7 +510,7 @@ static int sdgen(struct chan *c, char *d, struct dirtab *dir, int j, int s,
                if (s == DEVDOTDOT) {
                        mkqid(&q, QID(0, 0, 0, Qtopdir), 0, QTDIR);
                        snprintf(get_cur_genbuf(), GENBUF_SZ, "#%s", sddevtab.name);
-                       devdir(c, q, get_cur_genbuf(), 0, eve, 0555, dp);
+                       devdir(c, q, get_cur_genbuf(), 0, eve.name, 0555, dp);
                        return 1;
                }
 
@@ -552,7 +552,7 @@ static int sdgen(struct chan *c, char *d, struct dirtab *dir, int j, int s,
 
                mkqid(&q, QID(sdev->idno, s, 0, Qunitdir), 0, QTDIR);
                if (emptystr(unit->sdperm.user))
-                       kstrdup(&unit->sdperm.user, eve);
+                       kstrdup(&unit->sdperm.user, eve.name);
                devdir(c, q, unit->sdperm.name, 0, unit->sdperm.user, unit->sdperm.perm,
                       dp);
                kref_put(&sdev->r);
@@ -562,13 +562,13 @@ static int sdgen(struct chan *c, char *d, struct dirtab *dir, int j, int s,
                if (s == DEVDOTDOT) {
                        mkqid(&q, QID(0, 0, 0, Qtopdir), 0, QTDIR);
                        snprintf(get_cur_genbuf(), GENBUF_SZ, "#%s", sddevtab.name);
-                       devdir(c, q, get_cur_genbuf(), 0, eve, 0555, dp);
+                       devdir(c, q, get_cur_genbuf(), 0, eve.name, 0555, dp);
                        return 1;
                }
 
                sdev = sdgetdev(DEV(c->qid));
                if (sdev == NULL) {
-                       devdir(c, c->qid, "unavailable", 0, eve, 0, dp);
+                       devdir(c, c->qid, "unavailable", 0, eve.name, 0, dp);
                        return 1;
                }
 
@@ -609,7 +609,7 @@ static int sdgen(struct chan *c, char *d, struct dirtab *dir, int j, int s,
                mkqid(&q, QID(DEV(c->qid), UNIT(c->qid), i, Qpart),
                      unit->vers + pp->vers, QTFILE);
                if (emptystr(pp->sdperm.user))
-                       kstrdup(&pp->sdperm.user, eve);
+                       kstrdup(&pp->sdperm.user, eve.name);
                devdir(c, q, pp->sdperm.name, l, pp->sdperm.user, pp->sdperm.perm, dp);
                qunlock(&unit->ctl);
                kref_put(&sdev->r);
@@ -619,7 +619,7 @@ static int sdgen(struct chan *c, char *d, struct dirtab *dir, int j, int s,
        case Qpart:
                sdev = sdgetdev(DEV(c->qid));
                if (sdev == NULL) {
-                       devdir(c, q, "unavailable", 0, eve, 0, dp);
+                       devdir(c, q, "unavailable", 0, eve.name, 0, dp);
                        return 1;
                }
                unit = sdev->unit[UNIT(c->qid)];
@@ -1442,7 +1442,7 @@ static int32_t sdwstat(struct chan *c, uint8_t *dp, int32_t n)
        }
 
        /* TODO: Implement permissions checking and raise errors as appropriate. */
-       // if (strcmp(up->user, perm->user) && !iseve())
+       // if (strcmp(current->user.name, perm->user) && !iseve())
                // error(Eperm);
 
        d = kzmalloc(sizeof(struct dir) + n, 0);
index c3d2f65..7afb5e3 100644 (file)
@@ -100,7 +100,7 @@ static int srvgen(struct chan *c, char *name, struct dirtab *tab,
        if (s == DEVDOTDOT) {
                /* changing whatever c->aux was to be topdir */
                mkqid(&q, Qtopdir, 0, QTDIR);
-               devdir(c, q, devname(), 0, eve, 0555, dp);
+               devdir(c, q, devname(), 0, eve.name, 0555, dp);
                return 1;
        }
        spin_lock(&srvlock);
@@ -129,7 +129,7 @@ static void __srvinit(void)
        top_dir = kzmalloc(sizeof(struct srvfile), MEM_WAIT);
        /* kstrdup, just in case we free this later */
        kstrdup(&top_dir->name, "srv");
-       kstrdup(&top_dir->user, current ? current->user : "eve");
+       kstrdup(&top_dir->user, current ? current->user.name : "eve");
        top_dir->perm = DMDIR | 0770;
        /* +1 for existing, should never decref this */
        kref_init(&top_dir->ref, fake_release, 1);
@@ -226,7 +226,7 @@ static void srvcreate(struct chan *c, char *name, int omode, uint32_t perm)
        struct srvfile *srv;
        srv = kzmalloc(sizeof(struct srvfile), MEM_WAIT);
        kstrdup(&srv->name, name);
-       kstrdup(&srv->user, current ? current->user : "eve");
+       kstrdup(&srv->user, current ? current->user.name : "eve");
        srv->perm = 0770;       /* TODO need some security thoughts */
        atomic_set(&srv->opens, 1);     /* we return it opened */
        mkqid(&c->qid, Qsrvfile, 0, QTFILE);
index 1a33808..bbecd07 100644 (file)
 TAILQ_HEAD(vcore_tailq, vcore);
 /* 'struct proc_list' declared in sched.h (not ideal...) */
 
+struct username {
+       char name[128];
+       spinlock_t name_lock;
+};
+void set_username(struct username *u, char *name);
+
 #define PROC_PROGNAME_SZ 20
 // TODO: clean this up.
 struct proc {
@@ -33,7 +39,7 @@ struct proc {
        TAILQ_ENTRY(proc) sibling_link;
        spinlock_t proc_lock;
        struct user_context scp_ctx;    /* context for an SCP.  TODO: move to vc0 */
-       char user[64];
+       struct username user;
 
        /* This is effectively a (potentially short) version of argv[0].
         */
index 516ed8b..3269523 100644 (file)
@@ -29,6 +29,7 @@
 
 #pragma once
 
+#include <env.h>
 #include <err.h>
 #include <rendez.h>
 #include <rwlock.h>
@@ -1004,7 +1005,7 @@ static inline int abs(int a)
        return a;
 }
 
-extern char *eve;
+extern struct username eve;
 extern unsigned int qiomaxatomic;
 
 /* special sections */
index b2d7bf1..6cc1a13 100644 (file)
@@ -79,6 +79,7 @@ extern spinlock_t pid_hash_lock;
 
 /* Initialization */
 void proc_init(void);
+void proc_set_username(struct proc *p, char *name);
 void proc_set_progname(struct proc *p, char *name);
 void proc_replace_binary_path(struct proc *p, char *path);
 void proc_init_procinfo(struct proc* p);
index e47f76b..3eb6767 100644 (file)
@@ -122,3 +122,23 @@ void env_user_mem_free(env_t* e, void* start, size_t len)
        tlbflush();
 }
 
+void set_username(struct username *u, char *name)
+{
+       if (!name)
+               error(EINVAL, "New username is NULL");
+
+       if (strlen(name) > sizeof(u->name) - 1)
+               error(EINVAL, "New username for process more than %d chars long",
+                     sizeof(u->name) - 1);
+
+       spin_lock(&u->name_lock);
+
+       // 'backward' copy since reads aren't protected
+       u->name[0] = 0;
+       wmb(); // ensure user.name="" before writing the rest of the new name
+       strlcpy(&u->name[1], &name[1], sizeof(u->name));
+       wmb(); // ensure new name is written before writing first byte
+       u->name[0] = name[0];
+
+       spin_unlock(&u->name_lock);
+}
index e4a2b13..8cbaa0e 100644 (file)
@@ -98,7 +98,7 @@ struct queue *qlog;
 
 extern void nullmediumlink(void);
 extern void pktmediumlink(void);
-extern char *eve;
+extern struct username eve;
 static long ndbwrite(struct Fs *, char *unused_char_p_t, uint32_t, int);
 static void closeconv(struct conv *);
 static void setup_proto_qio_bypass(struct conv *cv);
@@ -136,7 +136,7 @@ static int ip3gen(struct chan *c, int i, struct dir *dp)
 
        cv = chan2conv(c);
        if (cv->owner == NULL)
-               kstrdup(&cv->owner, eve);
+               kstrdup(&cv->owner, eve.name);
        mkqid(&q, QID(PROTO(c->qid), CONV(c->qid), i), 0, QTFILE);
 
        switch (i) {
index f7d2a73..23ec45f 100644 (file)
@@ -85,13 +85,13 @@ netifgen(struct chan *c, char *unused_char_p_t, struct dirtab *vp,
                        case DEVDOTDOT:
                                q.path = 0;
                                q.type = QTDIR;
-                               devdir(c, q, ".", 0, eve, 0555, dp);
+                               devdir(c, q, ".", 0, eve.name, 0555, dp);
                                break;
                        case 0:
                                q.path = N2ndqid;
                                q.type = QTDIR;
                                strlcpy(get_cur_genbuf(), nif->name, GENBUF_SZ);
-                               devdir(c, q, get_cur_genbuf(), 0, eve, 0555, dp);
+                               devdir(c, q, get_cur_genbuf(), 0, eve.name, 0555, dp);
                                break;
                        default:
                                return -1;
@@ -139,23 +139,23 @@ netifgen(struct chan *c, char *unused_char_p_t, struct dirtab *vp,
                        case DEVDOTDOT:
                                q.type = QTDIR;
                                q.path = 0;
-                               devdir(c, q, ".", 0, eve, DMDIR | 0555, dp);
+                               devdir(c, q, ".", 0, eve.name, DMDIR | 0555, dp);
                                break;
                        case 0:
                                q.path = Ncloneqid;
-                               devdir(c, q, "clone", 0, eve, 0666, dp);
+                               devdir(c, q, "clone", 0, eve.name, 0666, dp);
                                break;
                        case 1:
                                q.path = Naddrqid;
-                               devdir(c, q, "addr", 0, eve, 0666, dp);
+                               devdir(c, q, "addr", 0, eve.name, 0666, dp);
                                break;
                        case 2:
                                q.path = Nstatqid;
-                               devdir(c, q, "stats", 0, eve, 0444, dp);
+                               devdir(c, q, "stats", 0, eve.name, 0444, dp);
                                break;
                        case 3:
                                q.path = Nifstatqid;
-                               devdir(c, q, "ifstats", 0, eve, 0444, dp);
+                               devdir(c, q, "ifstats", 0, eve.name, 0444, dp);
                                break;
                        default:
                                i -= 4;
@@ -166,7 +166,7 @@ netifgen(struct chan *c, char *unused_char_p_t, struct dirtab *vp,
                                q.type = QTDIR;
                                q.path = NETQID(i, N3rdqid);
                                snprintf(get_cur_genbuf(), GENBUF_SZ, "%d", i);
-                               devdir(c, q, get_cur_genbuf(), 0, eve, DMDIR | 0555, dp);
+                               devdir(c, q, get_cur_genbuf(), 0, eve.name, DMDIR | 0555, dp);
                                break;
                }
                return 1;
@@ -180,7 +180,7 @@ netifgen(struct chan *c, char *unused_char_p_t, struct dirtab *vp,
                o = f->owner;
                perm = f->mode;
        } else {
-               o = eve;
+               o = eve.name;
                perm = 0666;
        }
        switch (i) {
@@ -188,7 +188,7 @@ netifgen(struct chan *c, char *unused_char_p_t, struct dirtab *vp,
                        q.type = QTDIR;
                        q.path = N2ndqid;
                        strlcpy(get_cur_genbuf(), nif->name, GENBUF_SZ);
-                       devdir(c, q, get_cur_genbuf(), 0, eve, DMDIR | 0555, dp);
+                       devdir(c, q, get_cur_genbuf(), 0, eve.name, DMDIR | 0555, dp);
                        break;
                case 0:
                        q.path = NETQID(NETID(c->qid.path), Ndataqid);
@@ -200,15 +200,15 @@ netifgen(struct chan *c, char *unused_char_p_t, struct dirtab *vp,
                        break;
                case 2:
                        q.path = NETQID(NETID(c->qid.path), Nstatqid);
-                       devdir(c, q, "stats", 0, eve, 0444, dp);
+                       devdir(c, q, "stats", 0, eve.name, 0444, dp);
                        break;
                case 3:
                        q.path = NETQID(NETID(c->qid.path), Ntypeqid);
-                       devdir(c, q, "type", 0, eve, 0444, dp);
+                       devdir(c, q, "type", 0, eve.name, 0444, dp);
                        break;
                case 4:
                        q.path = NETQID(NETID(c->qid.path), Nifstatqid);
-                       devdir(c, q, "ifstats", 0, eve, 0444, dp);
+                       devdir(c, q, "ifstats", 0, eve.name, 0444, dp);
                        break;
                default:
                        return -1;
@@ -250,7 +250,7 @@ struct chan *netifopen(struct ether *nif, struct chan *c, int omode)
                        case Ndataqid:
                        case Nctlqid:
                                f = nif->f[id];
-                               if (netown(f, current->user, omode & 7) < 0)
+                               if (netown(f, current->user.name, omode & 7) < 0)
                                        error(EPERM, ERROR_FIXME);
                                break;
                }
@@ -458,7 +458,7 @@ int netifwstat(struct ether *nif, struct chan *c, uint8_t * db, int n)
        if (f == 0)
                error(ENOENT, ERROR_FIXME);
 
-       if (netown(f, current->user, O_WRITE) < 0)
+       if (netown(f, current->user.name, O_WRITE) < 0)
                error(EPERM, ERROR_FIXME);
 
        dir = kzmalloc(sizeof(struct dir) + n, 0);
@@ -547,7 +547,7 @@ static int netown(struct netfile *p, char *o, int omode)
        if (*p->owner) {
                if (strncmp(o, p->owner, KNAMELEN) == 0)        /* User */
                        mode = p->mode;
-               else if (strncmp(o, eve, KNAMELEN) == 0)        /* Bootes is group */
+               else if (strncmp(o, eve.name, KNAMELEN) == 0)   /* Bootes is group */
                        mode = p->mode << 3;
                else
                        mode = p->mode << 6;    /* Other */
@@ -617,7 +617,7 @@ static int openfile(struct ether *nif, int id)
                }
                f->inuse = 1;
                qreopen(f->in);
-               netown(f, current->user, 0);
+               netown(f, current->user.name, 0);
                qunlock(&f->qlock);
                qunlock(&nif->qlock);
                poperror();
index 805d699..6c23772 100644 (file)
@@ -46,7 +46,7 @@
 
 char *commonuser(void)
 {
-       return current->user;
+       return current->user.name;
 }
 
 struct chan *commonfdtochan(int fd, int mode, int a, int b)
index abf683a..d4c5502 100644 (file)
@@ -41,7 +41,7 @@
 #include <ip.h>
 
 extern uint32_t kerndate;
-extern char *eve;
+extern struct username eve;
 
 void mkqid(struct qid *q, int64_t path, uint32_t vers, int type)
 {
@@ -80,7 +80,7 @@ devdir(struct chan *c, struct qid qid, char *n,
        db->mtime = kerndate;
        db->length = length;
        db->uid = user;
-       db->gid = eve;
+       db->gid = eve.name;
        db->muid = user;
 }
 
@@ -112,7 +112,7 @@ devgen(struct chan *c, char *unused_name, struct dirtab *tab, int ntab,
        }
        if (tab->qid.vers == -1)
                return 0;
-       devdir(c, tab->qid, tab->name, tab->length, eve, tab->perm, dp);
+       devdir(c, tab->qid, tab->name, tab->length, eve.name, tab->perm, dp);
        return 1;
 }
 
@@ -323,7 +323,7 @@ devstat(struct chan *c, uint8_t * db, int n,
                                                for (elem = p = c->name->s; *p; p++)
                                                        if (*p == '/')
                                                                elem = p + 1;
-                                       devdir(c, c->qid, elem, 0, eve, DMDIR | 0555, &dir);
+                                       devdir(c, c->qid, elem, 0, eve.name, DMDIR | 0555, &dir);
                                        n = convD2M(&dir, db, n);
                                        if (n == 0)
                                                error(EINVAL, ERROR_FIXME);
@@ -383,7 +383,8 @@ devdirread(struct chan *c, char *d, long n,
 }
 
 /*
- * error(EPERM, ERROR_FIXME) if open permission not granted for up->env->user.
+ * error(EPERM, ERROR_FIXME) if open permission not granted for
+ * current->user.name
  */
 void devpermcheck(char *fileuid, uint32_t perm, int omode)
 {
@@ -394,9 +395,9 @@ void devpermcheck(char *fileuid, uint32_t perm, int omode)
        return;
        /* select user, group, or other from the traditional rwxrwxrwx, shifting
         * into the upper-most position */
-       if (strcmp(current->user, fileuid) == 0)
+       if (strcmp(current->user.name, fileuid) == 0)
                perm <<= 0;
-       else if (strcmp(current->user, eve) == 0)
+       else if (iseve())
                perm <<= 3;
        else
                perm <<= 6;
index 5ef5ee3..b4d5185 100644 (file)
@@ -259,6 +259,11 @@ void proc_init(void)
        atomic_init(&num_envs, 0);
 }
 
+void proc_set_username(struct proc *p, char *name)
+{
+       set_username(&p->user, name);
+}
+
 void proc_set_progname(struct proc *p, char *name)
 {
        if (name == NULL)
@@ -358,6 +363,8 @@ error_t proc_alloc(struct proc **pp, struct proc *parent, int flags)
                kstrdup(&p->binary_path, parent->binary_path);
        /* Set the basic status variables. */
        spinlock_init(&p->proc_lock);
+       memset(p->user.name, 0, sizeof(p->user.name));
+       spinlock_init(&p->user.name_lock);
        p->exitcode = 1337;     /* so we can see processes killed by the kernel */
        if (parent) {
                p->ppid = parent->pid;