From ff12cde8be8eddaa4b97f2c2f1d2dae497382e59 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Wed, 19 Aug 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-08-19 --- pc/devrtc.c | 10 ++++++++++ port/devarp.c | 9 ++++----- port/net.c | 52 +++++++++++++++++++++++++++++++------------------- power/dat.h | 2 +- power/devrtc.c | 10 ++++++++++ power/l.s | 8 ++++---- ss/devrtc.c | 10 ++++++++++ 7 files changed, 71 insertions(+), 30 deletions(-) diff --git a/pc/devrtc.c b/pc/devrtc.c index 662205be233cad1d66bf5325168ebadb97677a39..4c7b6b3ad7c5517616192ef72042e104611673ae 100644 --- a/pc/devrtc.c +++ b/pc/devrtc.c @@ -84,6 +84,16 @@ rtcstat(Chan *c, char *dp) Chan* rtcopen(Chan *c, int omode) { + omode = openmode(omode); + switch(c->qid.path){ + case Qrtc: + if(omode == OREAD) + break; + /* fall through */ + case Qnvram: + if(strcmp(u->p->user, eve)!=0 || !cpuserver) + error(Eperm); + } return devopen(c, omode, rtcdir, NRTC, devgen); } diff --git a/port/devarp.c b/port/devarp.c index d207dcd2cd1b8884ad7696995d2a68ef848965a9..fd9595c117b0b3a6bd90634373093fb5dc17f3e1 100644 --- a/port/devarp.c +++ b/port/devarp.c @@ -148,8 +148,7 @@ arpstat(Chan *c, char *db) Chan * arpopen(Chan *c, int omode) { - - if(c->qid.path == CHDIR){ + if(c->qid.path&CHDIR){ if(omode != OREAD) error(Eperm); } @@ -165,7 +164,6 @@ arpopen(Chan *c, int omode) break; } - c->mode = openmode(omode); c->flag |= COPEN; c->offset = 0; @@ -207,9 +205,10 @@ arpread(Chan *c, void *a, long n, ulong offset) int part, bytes, size; char *ststr; + if(c->qid.path&CHDIR) + return devdirread(c, a, n, arptab, Narptab, arpgen); + switch((int)(c->qid.path&~CHDIR)){ - case arpdirqid: - return devdirread(c, a, n, 0, 0, arpgen); case arpdataqid: bytes = c->offset; while(bytes < conf.arp*ARP_ENTRYLEN && n) { diff --git a/port/net.c b/port/net.c index 97ab15a87ca80d89ccdf3b431ae09c561a48441a..e5d28c42ec44067a9aa41c568e3983b43b4c3524 100644 --- a/port/net.c +++ b/port/net.c @@ -164,26 +164,6 @@ netstat(Chan *c, char *db, Network *np) } } -void -netwstat(Chan *c, char *db, Network *np) -{ - Dir dir; - Netprot *p; - - p = findprot(np, STREAMID(c->qid.path)); - if(p == 0) - error(Enonexist); - lock(np); - if(strncmp(p->owner, u->p->user, NAMELEN)){ - unlock(np); - error(Eperm); - } - convM2D(db, &dir); - strncpy(p->owner, dir.uid, NAMELEN); - p->mode = dir.mode; - unlock(np); -} - Chan * netopen(Chan *c, int omode, Network *np) { @@ -306,3 +286,35 @@ netdisown(Netprot *p) { p->owner[0] = 0; } + +#undef CHDIR /* BUG */ +#include "/sys/src/libc/9syscall/sys.h" + +void +netwstat(Chan *c, char *db, Network *np) +{ + Dir dir; + Netprot *p; + + p = findprot(np, STREAMID(c->qid.path)); + if(p == 0) + error(Enonexist); + lock(np); + + /* + * A network channel's ownership/permissions can be changed only if the + * wstat is by the owner or (HACK!) if it is performed using an fwstat. + * The latter allows processes started by a network listener to gain + * ownership of the connection. The open file descriptor is used as + * a capability for the connection. + */ + if(strncmp(p->owner, u->p->user, NAMELEN) != 0 && u->scallnr != FWSTAT){ + unlock(np); + error(Eperm); + } + convM2D(db, &dir); + strncpy(p->owner, dir.uid, NAMELEN); + p->mode = dir.mode; + + unlock(np); +} diff --git a/power/dat.h b/power/dat.h index 760e829c630105a4ba14c5e126fda424547f3d19..36eec58d9a7fec588ccb388cef63be0b2cbf9592 100644 --- a/power/dat.h +++ b/power/dat.h @@ -29,8 +29,8 @@ struct Lock struct Label { - ulong pc; ulong sp; + ulong pc; }; struct Conf diff --git a/power/devrtc.c b/power/devrtc.c index 4a56273dc6a2b380b625dc7b3bb3098419dc89f2..66158fd0f29eccb0c0621e099e29a77468edd9e3 100644 --- a/power/devrtc.c +++ b/power/devrtc.c @@ -97,6 +97,16 @@ rtcstat(Chan *c, char *dp) Chan* rtcopen(Chan *c, int omode) { + omode = openmode(omode); + switch(c->qid.path){ + case Qrtc: + if(omode == OREAD) + break; + /* fall through */ + case Qnvram: + if(strcmp(u->p->user, eve)!=0 || !cpuserver) + error(Eperm); + } return devopen(c, omode, rtcdir, NRTC, devgen); } diff --git a/power/l.s b/power/l.s index d4a74107f7c3b96129bdfef7dca9a3555277fac7..b4c07d873ffaa164f3682fbfdc80ea8371e4bda5 100644 --- a/power/l.s +++ b/power/l.s @@ -163,15 +163,15 @@ TEXT wbflush(SB), $-4 TEXT setlabel(SB), $-4 - MOVW R31, 0(R1) - MOVW R29, 4(R1) + MOVW R29, 0(R1) + MOVW R31, 4(R1) MOVW $0, R1 RET TEXT gotolabel(SB), $-4 - MOVW 0(R1), R31 - MOVW 4(R1), R29 + MOVW 0(R1), R29 + MOVW 4(R1), R31 MOVW $1, R1 RET diff --git a/ss/devrtc.c b/ss/devrtc.c index b0c144f39fe18b522b88985184f83fa36c8eff02..89bd7025d44855db7bde02d443e8861a5f48e290 100644 --- a/ss/devrtc.c +++ b/ss/devrtc.c @@ -89,6 +89,16 @@ rtcstat(Chan *c, char *dp) Chan* rtcopen(Chan *c, int omode) { + omode = openmode(omode); + switch(c->qid.path){ + case Qrtc: + if(omode == OREAD) + break; + /* fall through */ + case Qnvram: + if(strcmp(u->p->user, eve)!=0 || !cpuserver) + error(Eperm); + } return devopen(c, omode, rtcdir, NRTC, devgen); }