diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-08-22 19:45:29 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2012-08-22 19:45:29 +0200 |
commit | 8e5dd37eba4a206f875f6957aece99774933429e (patch) | |
tree | b048f052af635c9ae4df68bf48b56b2b6d472025 /sys/src/cmd/ndb | |
parent | 87fca361f72e5f583002fca4d308152e55b3ad28 (diff) |
ndb/dns: fix memory corruption and bad serveraddrs() range checks
Diffstat (limited to 'sys/src/cmd/ndb')
-rw-r--r-- | sys/src/cmd/ndb/dnresolve.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/sys/src/cmd/ndb/dnresolve.c b/sys/src/cmd/ndb/dnresolve.c index e99177d7d..b4239ebf8 100644 --- a/sys/src/cmd/ndb/dnresolve.c +++ b/sys/src/cmd/ndb/dnresolve.c @@ -832,7 +832,7 @@ serveraddrs(Query *qp, int nd, int depth) Dest *cur; if(nd >= Maxdest) /* dest array is full? */ - return Maxdest - 1; + return Maxdest; /* * look for a server whose address we already know. @@ -1080,13 +1080,12 @@ xmitquery(Query *qp, int medium, int depth, uchar *obuf, int inns, int len) */ if (qp->ndest > qp->curdest - p) { j = serveraddrs(qp, qp->curdest - p, depth); - if (j < 0 || j >= Maxdest) { + if (j < 0 || j > Maxdest) { dnslog("serveraddrs() result %d out of range", j); abort(); } qp->curdest = &qp->dest[j]; } - destck(qp->curdest); /* no servers, punt */ if (qp->ndest == 0) @@ -1439,9 +1438,10 @@ queryns(Query *qp, int depth, uchar *ibuf, uchar *obuf, ulong waitms, int inns) break; /* remove all addrs of responding server from list */ - for(np = qp->dest; np < qp->curdest; np++) - if(np->s == p->s) - p->nx = Maxtrans; + if(p != qp->curdest) + for(np = qp->dest; np < qp->curdest; np++) + if(np->s == p->s) + np->nx = Maxtrans; /* free or incorporate RRs in m */ rv = procansw(qp, &m, srcip, depth, p); |