summaryrefslogtreecommitdiff
path: root/sys/src/cmd/ndb
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-08-22 19:45:29 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-08-22 19:45:29 +0200
commit8e5dd37eba4a206f875f6957aece99774933429e (patch)
treeb048f052af635c9ae4df68bf48b56b2b6d472025 /sys/src/cmd/ndb
parent87fca361f72e5f583002fca4d308152e55b3ad28 (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.c12
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);