chiark / gitweb /
Only accept a reply from the subset of servers we sent the query.
[adns] / src / reply.c
index fbc2c830cefa5ae8f9b1a48ac5a011dbd3d37256..8da0bf2a648e8ff18ba5d3cecc59ddfa93eca91c 100644 (file)
@@ -26,7 +26,7 @@
 #include "internal.h"
     
 void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
-                    int serv, struct timeval now) {
+                    int serv, int viatcp, struct timeval now) {
   int cbyte, rrstart, wantedrrs, rri, foundsoa, foundns, cname_here;
   int id, f1, f2, qdcount, ancount, nscount, arcount;
   int flg_ra, flg_rd, flg_tc, flg_qr, opcode;
@@ -89,6 +89,12 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
               dgram+DNS_HDRSIZE,
               qu->query_dglen-DNS_HDRSIZE))
       continue;
+    if (viatcp) {
+      if (qu->state != query_tcpsent) continue;
+    } else {
+      if (qu->state != query_tosend) continue;
+      if (!(qu->udpsent & (1<<serv))) continue;
+    }
     break;
   }
   if (!qu) {
@@ -320,7 +326,6 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
   qu->flags |= adns_qf_usevc;
   
  x_restartquery:
-  
   if (qu->cname_dgram) {
     st= adns__mkquery_frdgram(qu->ads,&qu->vb,&qu->id,
                              qu->cname_dgram, qu->cname_dglen, qu->cname_begin,
@@ -335,6 +340,7 @@ void adns__procdgram(adns_state ads, const byte *dgram, int dglen,
     memcpy(newquery,qu->vb.buf,qu->vb.used);
   }
   
+  if (qu->state == query_tcpsent) qu->state= query_tosend;
   adns__reset_preserved(qu);
-  adns__query_udp(qu,now);
+  adns__query_send(qu,now);
 }