- test and log for bug #0003423
[oweals/gnunet.git] / src / gnsrecord / plugin_gnsrecord_dns.c
index 8f5907dc4833df7716c1986fc994007499021b29..0761e687fff23ea9e0217c1bd0e7201fa7cfa052 100644 (file)
@@ -44,7 +44,6 @@ dns_value_to_string (void *cls,
                      const void *data,
                      size_t data_size)
 {
-  const char *cdata;
   char* result;
   char tmp[INET6_ADDRSTRLEN];
 
@@ -231,23 +230,26 @@ dns_value_to_string (void *cls,
   case GNUNET_DNSPARSER_TYPE_TLSA:
     {
       const struct GNUNET_TUN_DnsTlsaRecord *tlsa;
-      char* tlsa_str;
+      char *tlsa_str;
+      char *hex;
 
-      cdata = data;
-      if ( (data_size <= sizeof (struct GNUNET_TUN_DnsTlsaRecord)) ||
-          ('\0' != cdata[data_size - 1]) )
+      if (data_size < sizeof (struct GNUNET_TUN_DnsTlsaRecord))
        return NULL; /* malformed */
       tlsa = data;
+      hex = GNUNET_DNSPARSER_bin_to_hex (&tlsa[1],
+                                         data_size - sizeof (struct GNUNET_TUN_DnsTlsaRecord));
       if (0 == GNUNET_asprintf (&tlsa_str,
-                               "%c %c %c %s",
-                               tlsa->usage,
-                               tlsa->selector,
-                               tlsa->matching_type,
-                               (const char *) &tlsa[1]))
+                               "%u %u %u %s",
+                               (unsigned int) tlsa->usage,
+                               (unsigned int) tlsa->selector,
+                               (unsigned int) tlsa->matching_type,
+                               hex))
       {
+        GNUNET_free (hex);
        GNUNET_free (tlsa_str);
        return NULL;
       }
+      GNUNET_free (hex);
       return tlsa_str;
     }
   default:
@@ -356,7 +358,7 @@ dns_string_to_value (void *cls,
       typep = strtok (sdup, " ");
       /* TODO: add typep mnemonic conversion according to RFC 4398 */
       if ( (NULL == typep) ||
-           (1 != sscanf (typep,
+           (1 != SSCANF (typep,
                          "%u",
                          &type)) ||
            (type > UINT16_MAX) )
@@ -366,7 +368,7 @@ dns_string_to_value (void *cls,
       }
       keyp = strtok (NULL, " ");
       if ( (NULL == keyp) ||
-           (1 != sscanf (keyp,
+           (1 != SSCANF (keyp,
                          "%u",
                          &key)) ||
            (key > UINT16_MAX) )
@@ -441,8 +443,13 @@ dns_string_to_value (void *cls,
 
       if (7 != SSCANF (s,
                       "rname=%253s mname=%253s %u,%u,%u,%u,%u",
-                      soa_rname, soa_mname,
-                      &soa_serial, &soa_refresh, &soa_retry, &soa_expire, &soa_min))
+                      soa_rname,
+                       soa_mname,
+                      &soa_serial,
+                       &soa_refresh,
+                       &soa_retry,
+                       &soa_expire,
+                       &soa_min))
       {
        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
              _("Unable to parse SOA record `%s'\n"),
@@ -464,9 +471,9 @@ dns_string_to_value (void *cls,
                                            &soa))
       {
        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-             _("Failed to serialize SOA record with mname `%s' and rname `%s'\n"),
-             soa_mname,
-             soa_rname);
+                    _("Failed to serialize SOA record with mname `%s' and rname `%s'\n"),
+                    soa_mname,
+                    soa_rname);
        return GNUNET_SYSERR;
       }
       *data_size = off;
@@ -487,8 +494,8 @@ dns_string_to_value (void *cls,
                                             s))
       {
        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-             _("Failed to serialize PTR record with value `%s'\n"),
-             s);
+                    _("Failed to serialize PTR record with value `%s'\n"),
+                    s);
        return GNUNET_SYSERR;
       }
       *data_size = off;
@@ -544,7 +551,7 @@ dns_string_to_value (void *cls,
       unsigned int port;
       size_t off;
 
-      if (2 != SSCANF(s,
+      if (4 != SSCANF(s,
                       "%u %u %u %253s",
                       &priority,
                       &weight,
@@ -594,22 +601,46 @@ dns_string_to_value (void *cls,
     memcpy (*data, &value_aaaa, sizeof (value_aaaa));
     return GNUNET_OK;
   case GNUNET_DNSPARSER_TYPE_TLSA:
-    *data_size = sizeof (struct GNUNET_TUN_DnsTlsaRecord) + strlen (s) - 6;
-    *data = tlsa = GNUNET_malloc (*data_size);
-    if (4 != SSCANF (s, "%c %c %c %s",
-                    &tlsa->usage,
-                    &tlsa->selector,
-                    &tlsa->matching_type,
-                    (char*)&tlsa[1]))
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  _("Unable to parse TLSA record string `%s'\n"),
-                  s);
-      *data_size = 0;
-      GNUNET_free (tlsa);
-      return GNUNET_SYSERR;
+      unsigned int usage;
+      unsigned int selector;
+      unsigned int matching_type;
+      size_t slen = strlen (s) + 1;
+      char hex[slen];
+
+      if (4 != SSCANF (s,
+                       "%u %u %u %s",
+                       &usage,
+                       &selector,
+                       &matching_type,
+                       hex))
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    _("Unable to parse TLSA record string `%s'\n"),
+                    s);
+        *data_size = 0;
+        return GNUNET_SYSERR;
+      }
+
+      *data_size = sizeof (struct GNUNET_TUN_DnsTlsaRecord) + strlen (hex) / 2;
+      *data = tlsa = GNUNET_malloc (*data_size);
+      tlsa->usage = (uint8_t) usage;
+      tlsa->selector = (uint8_t) selector;
+      tlsa->matching_type = (uint8_t) matching_type;
+      if (strlen (hex) / 2 !=
+          GNUNET_DNSPARSER_hex_to_bin (hex,
+                                       &tlsa[1]))
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                    _("Unable to parse TLSA record string `%s'\n"),
+                    s);
+        GNUNET_free (*data);
+        *data = NULL;
+        *data_size = 0;
+        return GNUNET_SYSERR;
+      }
+      return GNUNET_OK;
     }
-    return GNUNET_OK;
   default:
     return GNUNET_SYSERR;
   }
@@ -632,6 +663,7 @@ static struct {
   { "MX", GNUNET_DNSPARSER_TYPE_MX },
   { "TXT", GNUNET_DNSPARSER_TYPE_TXT },
   { "AAAA", GNUNET_DNSPARSER_TYPE_AAAA },
+  { "SRV", GNUNET_DNSPARSER_TYPE_SRV },
   { "TLSA", GNUNET_DNSPARSER_TYPE_TLSA },
   { NULL, UINT32_MAX }
 };
@@ -651,7 +683,7 @@ dns_typename_to_number (void *cls,
   unsigned int i;
 
   i=0;
-  while ( (name_map[i].name != NULL) &&
+  while ( (NULL != name_map[i].name) &&
          (0 != strcasecmp (dns_typename, name_map[i].name)) )
     i++;
   return name_map[i].number;
@@ -672,7 +704,7 @@ dns_number_to_typename (void *cls,
   unsigned int i;
 
   i=0;
-  while ( (name_map[i].name != NULL) &&
+  while ( (NULL != name_map[i].name) &&
          (type != name_map[i].number) )
     i++;
   return name_map[i].name;