summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2018-06-11 19:32:44 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2018-06-11 19:32:44 +0200
commit232382bfc14f0493705ef1e64a87a879f148c321 (patch)
treefd77f445ff338708370e7e328e6f1e104f509812
parent71402b2ea15d0e2bf939b6e095ad56fa14ab2d0a (diff)
ip/dhcp6d: ignore short and from non-local source packets
-rw-r--r--sys/src/cmd/ip/dhcp6d.c35
1 files changed, 28 insertions, 7 deletions
diff --git a/sys/src/cmd/ip/dhcp6d.c b/sys/src/cmd/ip/dhcp6d.c
index 96e104fa7..a130daed6 100644
--- a/sys/src/cmd/ip/dhcp6d.c
+++ b/sys/src/cmd/ip/dhcp6d.c
@@ -113,6 +113,21 @@ findifc(char *net, uchar ip[IPaddrlen])
return nil;
}
+static Iplifc*
+localonifc(Ipifc *ifc, uchar ip[IPaddrlen])
+{
+ Iplifc *lifc;
+ uchar net[IPaddrlen];
+
+ for(lifc = ifc->lifc; lifc != nil; lifc = lifc->next){
+ maskip(ip, lifc->mask, net);
+ if(ipcmp(net, lifc->net) == 0)
+ return lifc;
+ }
+
+ return nil;
+}
+
static int
openlisten(char *net)
{
@@ -310,21 +325,27 @@ main(int argc, char *argv[])
break;
}
- while((n = read(fd, ibuf, sizeof(ibuf))) > Udphdrsize+4){
- r->req.p = ibuf+Udphdrsize;
- r->req.e = ibuf+n;
+ while((n = read(fd, ibuf, sizeof(ibuf))) > 0){
+ if(n < Udphdrsize+4)
+ continue;
+
+ r->udp = (Udphdr*)ibuf;
+ if(isv4(r->udp->raddr))
+ continue;
+ if((r->ifc = findifc(netmtpt, r->udp->ifcaddr)) == nil)
+ continue;
+ if(localonifc(r->ifc, r->udp->raddr) == nil)
+ continue;
memmove(obuf, ibuf, Udphdrsize);
- r->udp = (Udphdr*)obuf;
+ r->req.p = ibuf+Udphdrsize;
+ r->req.e = ibuf+n;
r->resp.p = obuf+Udphdrsize;
r->resp.e = &obuf[sizeof(obuf)];
r->tra = r->req.p[1]<<16 | r->req.p[2]<<8 | r->req.p[3];
r->req.t = r->req.p[0];
- if((r->ifc = findifc(netmtpt, r->udp->ifcaddr)) == nil)
- continue;
-
if(debug)
fprint(2, "%I->%I(%s) typ=%d tra=%x\n",
r->udp->raddr, r->udp->laddr, r->ifc->dev,