From b7ea96cf198d50dd3ca528b2fd280f74e1b72015 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 29 May 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-05-29 --- pc/devvga.c | 20 +--------- port/devip.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++ port/stream.c | 4 +- port/tcpif.c | 1 + 4 files changed, 104 insertions(+), 21 deletions(-) diff --git a/pc/devvga.c b/pc/devvga.c index 64f6f239094aa07a8787afd3702f8bb8d3c45c1c..db1b1906120fda94d47f4c3cba9d89ea998fec4f 100644 --- a/pc/devvga.c +++ b/pc/devvga.c @@ -27,8 +27,7 @@ enum { Qvgasize= 2, Qvgatype= 3, Qvgaport= 4, - Qvgaiport= 5, - Nvga= 5, + Nvga= 4, }; Dirtab vgadir[]={ @@ -36,7 +35,6 @@ Dirtab vgadir[]={ "vgatype", {Qvgatype}, 0, 0666, "vgasize", {Qvgasize}, 0, 0666, "vgaport", {Qvgaport}, 0, 0666, - "vgaiport", {Qvgaiport}, 0, 0666, }; /* a routine from ../port/devcons.c */ @@ -141,8 +139,6 @@ vgaread(Chan *c, void *buf, long n, ulong offset) for (port=offset; portstproto == &ilinfo) ilstart(cp, IL_ACTIVE, 20); + /* + * stupid hack for BSD port's 512, 513, & 514 + * to make it harder for user to lie about his + * identity. -- presotto + */ + switch(cp->pdst){ + case 512: + case 513: + case 514: + pushq(c->stream, &bsdinfo); + break; + } } else if(strcmp(field[0], "disconnect") == 0) { if(cp->stproto != &udpinfo) @@ -986,3 +1004,85 @@ ip_conn(Ipconv *ic, Port dst, Port src, Ipaddr dest, char proto) return 0; } + +/* + * Fuck me sideways with a bargepole!!! -- philw + * + * BSD authentication protocol, used on ports 512, 513, & 514. + * This makes sure that a user can only write the REAL user id. + * + * q->ptr is number of nulls seen + */ +void +bsdopen(Queue *q, Stream *s) +{ + RD(q)->ptr = q; + WR(q)->ptr = q; +} +void +bsdclose(Queue *q) +{ + Block *bp; + + bp = allocb(0); + bp->type = M_HANGUP; + PUTNEXT(q->other, bp); +} +void +bsdiput(Queue *q, Block *bp) +{ + PUTNEXT(q, bp); +} +void +bsdoput(Queue *q, Block *bp) +{ + uchar *luser; + uchar *p; + Block *nbp; + int n; + + /* just pass it on if we've done authentication */ + if(q->ptr == 0 || bp->type != M_DATA){ + PUTNEXT(q, bp); + return; + } + + /* collect into a single block */ + lock(q); + if(q->first == 0) + q->first = pullup(bp, blen(bp)); + else{ + nbp = q->first; + nbp->next = bp; + q->first = pullup(nbp, blen(nbp)); + } + bp = q->first; + if(bp == 0){ + unlock(q); + bsdclose(q); + return; + } + + /* look for 2 nulls to indicate stderr port and local user */ + luser = memchr(bp->rptr, 0, BLEN(bp)); + if(luser == 0){ + unlock(q); + return; + } + luser++; + if(memchr(luser, 0, bp->wptr - luser) == 0){ + unlock(q); + return; + } + + /* if luser is a lie, hangup */ + if(memcmp(luser, u->p->user, strlen(u->p->user)+1) != 0) + bsdclose(q); + + /* mark queue as authenticated and pass data to remote side */ + q->ptr = 0; + q->first = 0; + bp->flags |= S_DELIM; + PUTNEXT(q, bp); + unlock(q); +} diff --git a/port/stream.c b/port/stream.c index a82f6ea9b96e537887e26779c4a54a92e2641c46..ca3b97fb4bf9e30d8f4ba14ed8514730c4091e91 100644 --- a/port/stream.c +++ b/port/stream.c @@ -604,7 +604,7 @@ pullup(Block *bp, int n) n -= BLEN(bp); while(nbp = bp->next){ i = BLEN(nbp); - if(i > n) { + if(i >= n) { memmove(bp->wptr, nbp->rptr, n); bp->wptr += n; nbp->rptr += n; @@ -622,7 +622,7 @@ pullup(Block *bp, int n) } /* - * expand a block list to be one byte, len bytes long + * expand a block list to be one block, len bytes long */ Block* expandb(Block *bp, int len) diff --git a/port/tcpif.c b/port/tcpif.c index ca3856aee6d8b6ec6a5cc56f8e6d6fdd777e08b5..6ced887ae15beb3be1e49fccaa56c3202c1fe08b 100644 --- a/port/tcpif.c +++ b/port/tcpif.c @@ -72,6 +72,7 @@ void tcpstart(Ipconv *s, int mode, ushort window, char tos) { Tcpctl *tcb = &s->tcpctl; + char msg[NAMELEN+2]; if(tcb->state != Closed) return;