gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r29668 - gnunet/src/gns


From: gnunet
Subject: [GNUnet-SVN] r29668 - gnunet/src/gns
Date: Fri, 27 Sep 2013 18:49:38 +0200

Author: grothoff
Date: 2013-09-27 18:49:37 +0200 (Fri, 27 Sep 2013)
New Revision: 29668

Modified:
   gnunet/src/gns/gnunet-service-gns_interceptor.c
Log:
-fix interceptor's GNS to DNS conversion

Modified: gnunet/src/gns/gnunet-service-gns_interceptor.c
===================================================================
--- gnunet/src/gns/gnunet-service-gns_interceptor.c     2013-09-27 16:38:29 UTC 
(rev 29667)
+++ gnunet/src/gns/gnunet-service-gns_interceptor.c     2013-09-27 16:49:37 UTC 
(rev 29668)
@@ -102,17 +102,22 @@
   struct InterceptLookupHandle *ilh = cls;
   struct GNUNET_DNSPARSER_Packet *packet = ilh->packet;
   struct GNUNET_DNSPARSER_Query *query = &packet->queries[0];
-  uint32_t i;
+  uint32_t i;  
   size_t len;
   int ret;
   char *buf;
   unsigned int num_answers;
+  unsigned int skip_answers;
+  unsigned int skip_additional;
+  size_t off;
     
   /* Put records in the DNS packet */
   num_answers = 0;
   for (i=0; i < rd_count; i++)
     if (rd[i].record_type == query->type)
       num_answers++;
+  skip_answers = 0;
+  skip_additional = 0;
 
   {
     struct GNUNET_DNSPARSER_Record answer_records[num_answers];
@@ -120,7 +125,6 @@
 
     packet->answers = answer_records;
     packet->additional_records = additional_records;
-
     /* FIXME: need to handle #GNUNET_NAMESTORE_RF_SHADOW_RECORD option
        (by ignoring records where this flag is set if there is any
        other record of that type in the result set) */
@@ -128,70 +132,121 @@
     {
       if (rd[i].record_type == query->type)
       {
-       answer_records[i].name = query->name;
-       answer_records[i].type = rd[i].record_type;
+       answer_records[i - skip_answers].name = query->name;
+       answer_records[i - skip_answers].type = rd[i].record_type;
        switch(rd[i].record_type)
        {
        case GNUNET_DNSPARSER_TYPE_NS:
        case GNUNET_DNSPARSER_TYPE_CNAME:
        case GNUNET_DNSPARSER_TYPE_PTR:
-         // FIXME: NO! need to use DNSPARSER!
-         answer_records[i].data.hostname = (char*)rd[i].data;
+         answer_records[i - skip_answers].data.hostname
+           = GNUNET_DNSPARSER_parse_name (rd[i].data,
+                                          rd[i].data_size,
+                                          &off);
+         if ( (off != rd[i].data_size) ||
+              (NULL == answer_records[i].data.hostname) )
+         {
+           GNUNET_break_op (0);
+           skip_answers++;
+         }
          break;
        case GNUNET_DNSPARSER_TYPE_SOA:
-         // FIXME: NO! need to use DNSPARSER!
-         answer_records[i].data.soa =
-           (struct GNUNET_DNSPARSER_SoaRecord *)rd[i].data;
+         answer_records[i - skip_answers].data.soa 
+           = GNUNET_DNSPARSER_parse_soa (rd[i].data,
+                                         rd[i].data_size,
+                                         &off);
+         if ( (off != rd[i].data_size) ||
+              (NULL == answer_records[i].data.soa) )
+         {
+           GNUNET_break_op (0);
+           skip_answers++;
+         }
          break;
+       case GNUNET_DNSPARSER_TYPE_SRV:
+         /* FIXME: SRV is not yet supported */
+         skip_answers++;
+         break;
        case GNUNET_DNSPARSER_TYPE_MX:
-         // FIXME: NO! need to use DNSPARSER!
-         answer_records[i].data.mx =
-           (struct GNUNET_DNSPARSER_MxRecord *)rd[i].data;
+         answer_records[i - skip_answers].data.mx 
+           = GNUNET_DNSPARSER_parse_mx (rd[i].data,
+                                        rd[i].data_size,
+                                        &off);
+         if ( (off != rd[i].data_size) ||
+              (NULL == answer_records[i].data.hostname) )
+         {
+           GNUNET_break_op (0);
+           skip_answers++;
+         }
          break;
        default:
-         answer_records[i].data.raw.data_len = rd[i].data_size;
-         answer_records[i].data.raw.data = (char*)rd[i].data;
+         answer_records[i - skip_answers].data.raw.data_len = rd[i].data_size;
+         answer_records[i - skip_answers].data.raw.data = (char*)rd[i].data;
          break;
        }
-       GNUNET_break (0 == (rd[i].flags & 
GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION));
-       answer_records[i].expiration_time.abs_value_us = rd[i].expiration_time;
-       answer_records[i].class = GNUNET_TUN_DNS_CLASS_INTERNET;
+       GNUNET_break (0 == (rd[i - skip_answers].flags & 
GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION));
+       answer_records[i - skip_answers].expiration_time.abs_value_us = 
rd[i].expiration_time;
+       answer_records[i - skip_answers].class = GNUNET_TUN_DNS_CLASS_INTERNET;
       }
       else
       {
-       additional_records[i].name = query->name;
-       additional_records[i].type = rd[i].record_type;
+       additional_records[i - skip_additional].name = query->name;
+       additional_records[i - skip_additional].type = rd[i].record_type;
        switch(rd[i].record_type)
        {
        case GNUNET_DNSPARSER_TYPE_NS:
        case GNUNET_DNSPARSER_TYPE_CNAME:
        case GNUNET_DNSPARSER_TYPE_PTR:
-         // FIXME: NO! need to use DNSPARSER!
-         additional_records[i].data.hostname = (char*)rd[i].data;
+         additional_records[i - skip_additional].data.hostname 
+           = GNUNET_DNSPARSER_parse_name (rd[i].data,
+                                          rd[i].data_size,
+                                          &off);
+         if ( (off != rd[i].data_size) ||
+              (NULL == additional_records[i].data.hostname) )
+         {
+           GNUNET_break_op (0);
+           skip_additional++;
+         }
          break;
        case GNUNET_DNSPARSER_TYPE_SOA:
-         // FIXME: NO! need to use DNSPARSER!
-         additional_records[i].data.soa =
-           (struct GNUNET_DNSPARSER_SoaRecord *)rd[i].data;
+         additional_records[i - skip_additional].data.soa 
+           = GNUNET_DNSPARSER_parse_soa (rd[i].data,
+                                         rd[i].data_size,
+                                         &off);
+         if ( (off != rd[i].data_size) ||
+              (NULL == additional_records[i].data.hostname) )
+         {
+           GNUNET_break_op (0);
+           skip_additional++;
+         }
          break;
        case GNUNET_DNSPARSER_TYPE_MX:
-         // FIXME: NO! need to use DNSPARSER!
-         additional_records[i].data.mx =
-           (struct GNUNET_DNSPARSER_MxRecord *)rd[i].data;
+         additional_records[i - skip_additional].data.mx 
+           = GNUNET_DNSPARSER_parse_mx (rd[i].data,
+                                        rd[i].data_size,
+                                        &off);
+         if ( (off != rd[i].data_size) ||
+              (NULL == additional_records[i].data.hostname) )
+         {
+           GNUNET_break_op (0);
+           skip_additional++;
+         }
          break;
+       case GNUNET_DNSPARSER_TYPE_SRV:
+         /* FIXME: SRV is not yet supported */
+         skip_answers++;
+         break;
        default:
-         // FIXME: NO! need to use DNSPARSER!
-         additional_records[i].data.raw.data_len = rd[i].data_size;
-         additional_records[i].data.raw.data = (char*)rd[i].data;
+         additional_records[i - skip_additional].data.raw.data_len = 
rd[i].data_size;
+         additional_records[i - skip_additional].data.raw.data = 
(char*)rd[i].data;
          break;
        }
-       GNUNET_break (0 == (rd[i].flags & 
GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION));
-       additional_records[i].expiration_time.abs_value_us = 
rd[i].expiration_time;
-       additional_records[i].class = GNUNET_TUN_DNS_CLASS_INTERNET; 
+       GNUNET_break (0 == (rd[i - skip_additional].flags & 
GNUNET_NAMESTORE_RF_RELATIVE_EXPIRATION));
+       additional_records[i - skip_additional].expiration_time.abs_value_us = 
rd[i].expiration_time;
+       additional_records[i - skip_additional].class = 
GNUNET_TUN_DNS_CLASS_INTERNET; 
       }
     }
-    packet->num_answers = num_answers;
-    packet->num_additional_records = rd_count - num_answers;
+    packet->num_answers = num_answers - skip_answers;
+    packet->num_additional_records = rd_count - num_answers - skip_additional;
     packet->flags.authoritative_answer = 1;
     if (NULL == rd)
       packet->flags.return_code = GNUNET_TUN_DNS_RETURN_CODE_NAME_ERROR;




reply via email to

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