gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r17775 - gnunet/src/vpn


From: gnunet
Subject: [GNUnet-SVN] r17775 - gnunet/src/vpn
Date: Wed, 26 Oct 2011 12:29:09 +0200

Author: toelke
Date: 2011-10-26 12:29:09 +0200 (Wed, 26 Oct 2011)
New Revision: 17775

Modified:
   gnunet/src/vpn/gnunet-service-dns.c
Log:
handle !A and !AAAA better

Modified: gnunet/src/vpn/gnunet-service-dns.c
===================================================================
--- gnunet/src/vpn/gnunet-service-dns.c 2011-10-26 10:05:09 UTC (rev 17774)
+++ gnunet/src/vpn/gnunet-service-dns.c 2011-10-26 10:29:09 UTC (rev 17775)
@@ -481,11 +481,26 @@
     return GNUNET_OK;
   }
 
-  answer->pkt.addrsize = ntohs (pdns->answers[0]->data_len);
+  int i = 0;
+
+  while (i < ntohs(pdns->s.ancount) &&
+         (pdns->answers[i]->type != 28 ||
+          pdns->answers[i]->type != 1))
+    i++;
+
+  if (i >= ntohs (pdns->s.ancount))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Answer does not contain any usable 
answers.\n");
+    free_parsed_dns_packet (pdns);
+    GNUNET_free (answer);
+    return GNUNET_OK;
+  }
+
+  answer->pkt.addrsize = ntohs (pdns->answers[i]->data_len);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "The first answer has the addrlen %d\n",
               answer->pkt.addrsize);
-  memcpy (answer->pkt.addr, pdns->answers[0]->data,
-          ntohs (pdns->answers[0]->data_len));
+  memcpy (answer->pkt.addr, pdns->answers[i]->data,
+          ntohs (pdns->answers[i]->data_len));
 
   memcpy(answer->pkt.from, query_states[dns->s.id].remote_ip, 
query_states[dns->s.id].addrlen);
   memcpy(answer->pkt.to, query_states[dns->s.id].local_ip, 
query_states[dns->s.id].addrlen);
@@ -521,13 +536,18 @@
     drec_data->type = htons (28);       /* AAAA */
     drec_data->data_len = htons (16);
   }
-  else
+  else if (4 == answer->pkt.addrsize)
   {
     answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_REMOTE_A;
     dque->type = htons (1);     /* A */
     drec_data->type = htons (1);        /* A */
     drec_data->data_len = htons (4);
   }
+  else
+    {
+      GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "dns-answer with data_len = %d\n", 
answer->pkt.addrsize);
+      GNUNET_break(0);
+    }
   dque->class = htons (1);      /* IN */
 
   char *anname =
@@ -536,7 +556,7 @@
   memcpy (anname, "\xc0\x0c", 2);
   drec_data->class = htons (1); /* IN */
 
-  drec_data->ttl = pdns->answers[0]->ttl;
+  drec_data->ttl = pdns->answers[i]->ttl;
 
   /* Calculate at which offset in the packet the IPv6-Address belongs, it is
    * filled in by the daemon-vpn */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]