From adad83c7fcbb2a8f3108ab8f10e94e099cf6951e Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Tue, 18 Mar 2003 00:00:00 +0000 Subject: [PATCH] Plan 9 from Bell Labs 2003-03-18 --- ip/arp.c | 8 ++++---- ip/ip.c | 3 ++- ip/ipifc.c | 9 +++++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/ip/arp.c b/ip/arp.c index 7a52711fa549d93df9ec25c3eb4001cb5534202b..6e25de730b99b0d0094694d9bd2641cb021ffb68 100644 --- a/ip/arp.c +++ b/ip/arp.c @@ -125,7 +125,7 @@ newarp6(Arp *arp, uchar *ip, Ipifc *ifc, int addrxt) memmove(a->ip, ip, sizeof(a->ip)); a->utime = NOW; - a->ctime = a->utime; + a->ctime = 0; a->type = m; a->rtime = NOW + ReTransTimer; @@ -354,14 +354,16 @@ arpenter(Fs *fs, int version, uchar *ip, uchar *mac, int n, int refresh) } } - a->hold = nil; a->ifc = ifc; a->ifcid = ifc->ifcid; bp = a->hold; a->hold = nil; if(version == V4) ip += IPv4off; + a->utime = NOW; + a->ctime = a->utime; qunlock(arp); + while(bp){ next = bp->list; if(ifc != nil){ @@ -380,8 +382,6 @@ arpenter(Fs *fs, int version, uchar *ip, uchar *mac, int n, int refresh) freeb(bp); bp = next; } - a->utime = NOW; - a->ctime = a->utime; return; } } diff --git a/ip/ip.c b/ip/ip.c index 24062946909f0c963942781201e8c5454ebc39b0..2936ce1f6f7fa8ee673efa7bdf2822bdf97387b4 100644 --- a/ip/ip.c +++ b/ip/ip.c @@ -486,7 +486,7 @@ ipiput4(Fs *f, Ipifc *ifc, Block *bp) /* don't forward to source's network */ conv.r = nil; r = v4lookup(f, h->dst, &conv); - if(r != nil && r->ifc == ifc){ + if(r == nil || r->ifc == ifc){ ip->stats[OutDiscards]++; freeblist(bp); return; @@ -502,6 +502,7 @@ ipiput4(Fs *f, Ipifc *ifc, Block *bp) } /* reassemble if the interface expects it */ +if(r->ifc == nil) panic("nil route rfc"); if(r->ifc->reassemble){ frag = nhgets(h->frag); if(frag) { diff --git a/ip/ipifc.c b/ip/ipifc.c index 003c719beab45473d851f520db7cc2bfa932d30b..bb92e29faef99414d57fddb9175142c18085b023 100644 --- a/ip/ipifc.c +++ b/ip/ipifc.c @@ -305,10 +305,19 @@ ipifckick(void *x) return; ifc = (Ipifc*)c->ptcl; + if(!canrlock(ifc)){ + freeb(bp); + return; + } + if(waserror()){ + runlock(ifc); + nexterror(); + } if(ifc->m == nil || ifc->m->pktin == nil) freeb(bp); else (*ifc->m->pktin)(c->p->f, ifc, bp); + runlock(ifc); } /*