fix segfault
[oweals/gnunet.git] / src / namestore / namestore_api.c
index ae90e7441886891e189f9cab478ebc1961f48448..ddf3742db2b335f2633fc5d111094c9e11b3fb08 100644 (file)
@@ -258,11 +258,21 @@ handle_lookup_name_response (struct GNUNET_NAMESTORE_QueueEntry *qe,
   }
 
   name = (char *) &msg[1];
+  if (name_len > 0)
+  {
+    GNUNET_assert ('\0' == name[name_len -1]);
+    GNUNET_assert ((name_len - 1) == strlen(name));
+  }
   rd_tmp = &name[name_len];
 
   /* deserialize records */
   struct GNUNET_NAMESTORE_RecordData rd[rd_count];
-  GNUNET_NAMESTORE_records_deserialize(rd_len, rd_tmp, rd_count, rd);
+  if (GNUNET_OK != GNUNET_NAMESTORE_records_deserialize(rd_len, rd_tmp, rd_count, rd))
+  {
+    GNUNET_break_op (0);
+    return;
+  }
+
 
   /* reset values if values not contained */
   if (contains_sig == GNUNET_NO)
@@ -376,7 +386,6 @@ handle_record_remove_response (struct GNUNET_NAMESTORE_QueueEntry *qe,
   /* Operation done, remove */
   GNUNET_CONTAINER_DLL_remove(h->op_head, h->op_tail, qe);
 
-
   int res = ntohl (msg->op_result);
   /**
    *  result:
@@ -473,10 +482,19 @@ handle_zone_to_name_response (struct GNUNET_NAMESTORE_QueueEntry *qe,
     expire = GNUNET_TIME_absolute_ntoh(msg->expire);
 
     name_tmp = (char *) &msg[1];
+    if (name_len > 0)
+    {
+      GNUNET_assert ('\0' == name_tmp[name_len -1]);
+      GNUNET_assert (name_len -1 == strlen(name_tmp));
+    }
     rd_tmp = &name_tmp[name_len];
 
     struct GNUNET_NAMESTORE_RecordData rd[rd_count];
-    GNUNET_NAMESTORE_records_deserialize(rd_ser_len, rd_tmp, rd_count, rd);
+    if (GNUNET_OK != GNUNET_NAMESTORE_records_deserialize(rd_ser_len, rd_tmp, rd_count, rd))
+    {
+      GNUNET_break_op (0);
+      return;
+    }
 
     if (qe->proc != NULL)
       qe->proc (qe->proc_cls, &msg->zone_key, expire, name_tmp, rd_count, rd, &msg->signature);
@@ -896,7 +914,6 @@ clean_up_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 
   while (NULL != (q = h->op_head))
   {
-    GNUNET_break (0);
     GNUNET_CONTAINER_DLL_remove (h->op_head, h->op_tail, q);
     GNUNET_free (q);
   }
@@ -1041,6 +1058,7 @@ GNUNET_NAMESTORE_record_put (struct GNUNET_NAMESTORE_Handle *h,
  * to validate signatures received from the network.
  *
  * @param public_key public key of the zone
+ * @param expire block expiration
  * @param name name that is being mapped (at most 255 characters long)
  * @param rd_count number of entries in 'rd' array
  * @param rd array of records with data to store
@@ -1049,6 +1067,7 @@ GNUNET_NAMESTORE_record_put (struct GNUNET_NAMESTORE_Handle *h,
  */
 int
 GNUNET_NAMESTORE_verify_signature (const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *public_key,
+                                   const struct GNUNET_TIME_Absolute expire,
                                   const char *name,
                                   unsigned int rd_count,
                                   const struct GNUNET_NAMESTORE_RecordData *rd,
@@ -1060,6 +1079,8 @@ GNUNET_NAMESTORE_verify_signature (const struct GNUNET_CRYPTO_RsaPublicKeyBinary
   char * name_tmp;
   char * rd_tmp;
   struct GNUNET_CRYPTO_RsaSignaturePurpose *sig_purpose;
+  struct GNUNET_TIME_AbsoluteNBO *expire_tmp;
+  struct GNUNET_TIME_AbsoluteNBO expire_nbo = GNUNET_TIME_absolute_hton(expire);
 
   GNUNET_assert (public_key != NULL);
   GNUNET_assert (name != NULL);
@@ -1078,11 +1099,13 @@ GNUNET_NAMESTORE_verify_signature (const struct GNUNET_CRYPTO_RsaPublicKeyBinary
     return GNUNET_SYSERR;
   }
 
-  sig_purpose = GNUNET_malloc(sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) + rd_ser_len + name_len);
+  sig_purpose = GNUNET_malloc(sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) + sizeof (struct GNUNET_TIME_AbsoluteNBO) + rd_ser_len + name_len);
   sig_purpose->size = htonl (sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose)+ rd_ser_len + name_len);
   sig_purpose->purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN);
-  name_tmp = (char *) &sig_purpose[1];
+  expire_tmp = (struct GNUNET_TIME_AbsoluteNBO *) &sig_purpose[1];
+  name_tmp = (char *) &expire_tmp[1];
   rd_tmp = &name_tmp[name_len];
+  memcpy (expire_tmp, &expire_nbo, sizeof (struct GNUNET_TIME_AbsoluteNBO));
   memcpy (name_tmp, name, name_len);
   memcpy (rd_tmp, rd_ser, rd_ser_len);
 
@@ -1521,6 +1544,15 @@ GNUNET_NAMESTORE_zone_iterator_next (struct GNUNET_NAMESTORE_ZoneIterator *it)
 
   GNUNET_assert (NULL != it);
   h = it->h;
+  struct GNUNET_NAMESTORE_ZoneIterator *tmp = it->h->z_head;
+
+  while (tmp != NULL)
+  {
+    if (tmp == it)
+      break;
+    tmp = tmp->next;
+  }
+  GNUNET_assert (NULL != tmp);
 
   /* set msg_size*/
   msg_size = sizeof (struct ZoneIterationNextMessage);
@@ -1555,6 +1587,15 @@ GNUNET_NAMESTORE_zone_iteration_stop (struct GNUNET_NAMESTORE_ZoneIterator *it)
   struct PendingMessage *pe;
   size_t msg_size = 0;
   struct GNUNET_NAMESTORE_Handle *h = it->h;
+  struct GNUNET_NAMESTORE_ZoneIterator *tmp = it->h->z_head;
+
+  while (tmp != NULL)
+  {
+    if (tmp == it)
+      break;
+    tmp = tmp->next;
+  }
+  GNUNET_assert (NULL != tmp);
 
   /* set msg_size*/
   msg_size = sizeof (struct ZoneIterationStopMessage);