From 07cba2253ec1f863bba53c2d3829d97e649238e7 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 24 Dec 1999 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 1999-12-24 --- ip/tcp.c | 2 +- port/auth.c | 2 +- port/chan.c | 55 +++++++++++++++++++++++++++++++---------------------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/ip/tcp.c b/ip/tcp.c index 7dd920aae5eff420750f4ca1c26280983618fd73..09c6a9ba244ba6e96b829c38b1b262446b6233cd 100644 --- a/ip/tcp.c +++ b/ip/tcp.c @@ -2012,7 +2012,7 @@ addreseq(Tcpctl *tcb, Tcp *seg, Block *bp, ushort length) if(i > 100 && once++ == 0){ print("very long tcp resequence queue: %d\n", length); for(rp1 = tcb->reseq, i = 0; i < 10 && rp1 != nil; rp1 = rp1->next, i++) - print("0x%lux 0x%lux 0x%ux", rp1->seg.seq, rp1->seg.ack, + print("0x%lux 0x%lux 0x%ux\n", rp1->seg.seq, rp1->seg.ack, rp1->seg.flags); return -1; } diff --git a/port/auth.c b/port/auth.c index 4e52fe659b29d3cdf711732c4a3db92c9514c233..3cd0edf22497a85639b5bf6a1e9465a020683bc0 100644 --- a/port/auth.c +++ b/port/auth.c @@ -537,7 +537,7 @@ authentwrite(Chan *c, char *a, int n) /* * create an authenticator and return it and optionally the - * unencripted ticket + * unencrypted ticket */ long authentread(Chan *c, char *a, int n) diff --git a/port/chan.c b/port/chan.c index 398bd2e8260f87f4bff3f28139128f0205f02f1f..959b73df6d3022387f7f5c60a33b756238c88e14 100644 --- a/port/chan.c +++ b/port/chan.c @@ -156,7 +156,8 @@ addelem(Cname *n, char *s) n->s = t; n->alen = a; } - n->s[n->len++] = '/'; + if(n->len>0 && n->s[n->len-1]!='/' && s[0]!='/') /* don't insert extra slash if one is present */ + n->s[n->len++] = '/'; memmove(n->s+n->len, s, i+1); n->len += i; return n; @@ -473,6 +474,21 @@ undomount(Chan *c) return c; } +Chan * +updatecname(Chan *c, char *name, int dotdot) +{ + if(c->name == nil) + c->name = newcname(name); + else + c->name = addelem(c->name, name); + + if(dotdot){ + cleancname(c->name, c->name->s[0]=='#'); /* could be cheaper */ + c = undomount(c); + } + return c; +} + int walk(Chan **cp, char *name, int domnt) { @@ -494,16 +510,7 @@ walk(Chan **cp, char *name, int domnt) ac->flag &= ~CCREATE; /* not inherited through a walk */ if(devtab[ac->type]->walk(ac, name) != 0) { /* walk succeeded: update name associated with *cp (ac) */ - c = *cp; - if(c->name == nil) - c->name = newcname(name); - else - c->name = addelem(c->name, name); - - if(dotdot){ - cleancname(c->name, c->name->s[0]=='#'); /* could be cheaper */ - *cp = undomount(c); - } + *cp = updatecname(*cp, name, dotdot); if(domnt) *cp = domount(*cp); return 0; @@ -535,23 +542,22 @@ walk(Chan **cp, char *name, int domnt) if(c == nil) return -1; - if(dotdot) - c = undomount(c); - if(c->mh){ putmhead(c->mh); c->mh = nil; } - if(domnt) { - if(waserror()) { - cclose(c); - nexterror(); - } - c = domount(c); - poperror(); - } + + /* replace c->name by ac->name */ + cnameclose(c->name); + c->name = ac->name; + if(ac->name) + incref(ac->name); + c = updatecname(c, name, dotdot); cclose(ac); *cp = c; + + if(domnt) + *cp = domount(c); return 0; } @@ -733,8 +739,11 @@ namec(char *name, int amode, int omode, ulong perm) mntok = 0; elem[0] = 0; n = 0; - while(*name && (*name != '/' || n < 2)) + while(*name && (*name != '/' || n < 2)){ + if(n >= NAMELEN-1) + error(Efilename); elem[n++] = *name++; + } elem[n] = '\0'; n = chartorune(&r, elem+1)+1; if(r == 'M') {