From 6ed5f87bccc9666b0d9984229c71a2c7559a7103 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 28 Jan 1992 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1992-01-28 --- port/devip.c | 35 +++++++++++++++++++++++++++-------- port/devproc.c | 5 +++++ port/ipdat.h | 10 +++++++--- port/pgrp.c | 16 +++++----------- port/portdat.h | 12 ++++++++++++ port/tcpinput.c | 8 +++++++- port/tcptimer.c | 2 +- 7 files changed, 64 insertions(+), 24 deletions(-) diff --git a/port/devip.c b/port/devip.c index aaf9ea270654a5689f8de82273f23d240f29860d..b20872dbdb1d1007b5bef6110dd23d29645b1b2c 100644 --- a/port/devip.c +++ b/port/devip.c @@ -212,9 +212,9 @@ ipread(Chan *c, void *a, long n, ulong offset) long ipwrite(Chan *c, char *a, long n, ulong offset) { - int m, backlog, type; + int m, backlog, type, priv; char *field[5], *ctlarg[5], buf[256]; - Port port, base; + Port port; Ipconv *cp; type = STREAMTYPE(c->qid.path); @@ -248,12 +248,12 @@ ipwrite(Chan *c, char *a, long n, ulong offset) default: error(Ebadarg); case 2: - base = PORTALLOC; + priv = 0; break; case 3: if(strcmp(ctlarg[2], "r") != 0) error(Eperm); - base = PRIVPORTALLOC; + priv = 1; break; } cp->dst = ipparse(ctlarg[0]); @@ -262,7 +262,7 @@ ipwrite(Chan *c, char *a, long n, ulong offset) /* If we have no local port assign one */ qlock(&ipalloc); if(cp->psrc == 0) - cp->psrc = nextport(ipconv[c->dev], base); + cp->psrc = nextport(ipconv[c->dev], priv); qunlock(&ipalloc); if(cp->stproto == &tcpinfo) @@ -557,6 +557,7 @@ tcpstopen(Queue *q, Stream *s) ipc->readq = RD(q); ipc->readq->rp = &tcpflowr; + ipc->err = 0; RD(q)->ptr = (void *)ipc; WR(q)->next->ptr = (void *)ipc->ipinterface; @@ -852,14 +853,32 @@ portused(Ipconv *ic, Port port) return 0; } +static Port lastport[2] = { PORTALLOC-1, PRIVPORTALLOC-1 }; + Port -nextport(Ipconv *ic, Port base) +nextport(Ipconv *ic, int priv) { + Port base; + Port max; + Port *p; Port i; - for(i = base; i < PORTMAX; i++) + if(priv){ + base = PRIVPORTALLOC; + max = PORTALLOC; + p = &lastport[1]; + } else { + base = PORTALLOC; + max = PORTMAX; + p = &lastport[0]; + } + + for(i = *p + 1; i < max; i++) + if(!portused(ic, i)) + return(*p = i); + for(i = base ; i <= *p; i++) if(!portused(ic, i)) - return(i); + return(*p = i); return(0); } diff --git a/port/devproc.c b/port/devproc.c index 1b73c44dee954c58ca503aa25059379556a5d28d..b0ff664e486e235869ef5bf67a96891e5336ebfb 100644 --- a/port/devproc.c +++ b/port/devproc.c @@ -264,6 +264,11 @@ procread(Chan *c, void *va, long n, ulong offset) } if(offset >= KZERO) { + /* prevent users reading authentication crypt keys */ + if(offset >= pgrpalloc.cryptbase) + if(offset < pgrpalloc.crypttop) + error(Eperm); + /* validate physical kernel addresses */ if(offset < KZERO+conf.npage0*BY2PG){ if(offset+n > KZERO+conf.npage0*BY2PG) n = KZERO+conf.npage0*BY2PG - offset; diff --git a/port/ipdat.h b/port/ipdat.h index d7101c6a5e1cac587725ca43e7bf1db88578821d..f110b2b1c0300d5bccbacc7d41e7c6a1ae90ba6e 100644 --- a/port/ipdat.h +++ b/port/ipdat.h @@ -194,9 +194,8 @@ struct Timer void *arg; }; -struct Tcpctl +struct Tctl { - QLock; uchar state; /* Connection state */ uchar type; /* Listening or active connection */ uchar code; /* Icmp code */ @@ -242,6 +241,11 @@ struct Tcpctl int srtt; /* Shortened round trip */ int mdev; /* Mean deviation of round trip */ }; +struct Tcpctl +{ + QLock; + struct Tctl; +}; struct Tcp { @@ -435,7 +439,7 @@ void udprcvmsg(Ipconv *, Block*); Block *btrim(Block*, int, int); Block *ip_reassemble(int, Block*, Etherhdr*); Ipconv *portused(Ipconv *, Port); -Port nextport(Ipconv *, Port); +Port nextport(Ipconv *, int); Fragq *ipfragallo(void); void ipfragfree(Fragq*, int); void iproute(uchar*, uchar*); diff --git a/port/pgrp.c b/port/pgrp.c index 9848a5f3ea7aaaab69215a31c94ee8dc41500cbc..15595912367d100e4a3e0d2ed549d0b074ae1b56 100644 --- a/port/pgrp.c +++ b/port/pgrp.c @@ -5,13 +5,7 @@ #include "fns.h" #include "../port/error.h" -struct -{ - Lock; - Pgrp *arena; - Pgrp *free; - ulong pgrpid; -}pgrpalloc; +Pgrps pgrpalloc; struct { @@ -43,10 +37,10 @@ grpinit(void) Mhead *hm, *hem; Crypt *cr; - /* - * need to /dev/proc read protect crypt memory - */ - cr = ialloc(conf.npgrp*sizeof(Crypt), 0); + i = conf.npgrp*sizeof(Crypt); + cr = ialloc(i, 0); + pgrpalloc.cryptbase = (ulong)cr; + pgrpalloc.crypttop = (ulong)cr + i; pgrpalloc.arena = ialloc(conf.npgrp*sizeof(Pgrp), 0); pgrpalloc.free = pgrpalloc.arena; diff --git a/port/portdat.h b/port/portdat.h index f3fd35cb28ba5c3d9c310b7e390efc8207b3a045..95cd8e554394285482837c2b819286b0a5acdb80 100644 --- a/port/portdat.h +++ b/port/portdat.h @@ -23,6 +23,7 @@ typedef struct Network Network; typedef struct Note Note; typedef struct Page Page; typedef struct Palloc Palloc; +typedef struct Pgrps Pgrps; typedef struct Pgrp Pgrp; typedef struct Proc Proc; typedef struct Pte Pte; @@ -427,6 +428,16 @@ struct Palloc int wanted; /* Do the wakeup at free */ }; +struct Pgrps +{ + Lock; + Pgrp *arena; + Pgrp *free; + ulong pgrpid; + ulong cryptbase; + ulong crypttop; +}; + struct Waitq { Waitmsg w; @@ -672,6 +683,7 @@ extern char devchar[]; extern char *conffile; extern char *statename[]; extern Palloc palloc; +extern Pgrps pgrpalloc; extern Image swapimage; extern char eve[]; extern int nrdy; diff --git a/port/tcpinput.c b/port/tcpinput.c index 0e70c891b3da76682066ba3205aa8e6eaf4e1460..6eeef0e998ac0d7f7bfc053a91314c15a985476d 100644 --- a/port/tcpinput.c +++ b/port/tcpinput.c @@ -824,13 +824,19 @@ copyb(Block *bp, int count) ushort tcp_mss = DEF_MSS; /* Maximum segment size to be sent with SYN */ int tcp_irtt = DEF_RTT; /* Initial guess at round trip time */ +static void +cleartcp(struct Tctl *a) +{ + memset(a, 0, sizeof(struct Tctl)); +} + void init_tcpctl(Ipconv *s) { Tcpctl *tcb = &s->tcpctl; - memset(tcb, 0, sizeof(Tcpctl)); + cleartcp(tcb); tcb->cwind = tcb->mss = tcp_mss; tcb->ssthresh = 65535; diff --git a/port/tcptimer.c b/port/tcptimer.c index debc17ef3a36320d0d42519e5071ebeffb47e8c1..50c2052f9661d607b2d358ce8e1ac52345650f8c 100644 --- a/port/tcptimer.c +++ b/port/tcptimer.c @@ -1,4 +1,4 @@ - #include "u.h" +#include "u.h" #include "lib.h" #include "mem.h" #include "dat.h"