- test for external iterator
[oweals/gnunet.git] / src / util / container_meta_data.c
index e725486b77081ac629c267c5706a82b3662c7d1d..a868e817da61580925a6200074a81aca3ed3e31a 100644 (file)
@@ -427,7 +427,7 @@ void
 GNUNET_CONTAINER_meta_data_add_publication_date (struct
                                                  GNUNET_CONTAINER_MetaData *md)
 {
-  char *dat;
+  const char *dat;
   struct GNUNET_TIME_Absolute t;
 
   t = GNUNET_TIME_absolute_get ();
@@ -438,7 +438,6 @@ GNUNET_CONTAINER_meta_data_add_publication_date (struct
                                      EXTRACTOR_METATYPE_PUBLICATION_DATE,
                                      EXTRACTOR_METAFORMAT_UTF8, "text/plain",
                                      dat, strlen (dat) + 1);
-  GNUNET_free (dat);
 }
 
 
@@ -805,7 +804,7 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData
   mdata = (char *) &ent[md->item_count];
   off = size - (md->item_count * sizeof (struct MetaDataEntry));
   i = 0;
-  for (pos = md->items_tail; NULL != pos; pos = pos->prev)
+  for (pos = md->items_head; NULL != pos; pos = pos->next)
   {
     ent[i].type = htonl ((uint32_t) pos->type);
     ent[i].format = htonl ((uint32_t) pos->format);
@@ -836,7 +835,7 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData
   cdata = NULL;
   left = size;
   i = 0;
-  for (pos = md->items_tail; NULL != pos; pos = pos->prev)
+  for (pos = md->items_head; NULL != pos; pos = pos->next)
   {
     comp = GNUNET_NO;
     if (0 == (opt & GNUNET_CONTAINER_META_DATA_SERIALIZE_NO_COMPRESS))
@@ -881,6 +880,7 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData
         hdr->entries = htonl (md->item_count - i);
         memcpy (&dst[sizeof (struct MetaDataHeader)], cdata, clen);
         GNUNET_free (cdata);
+       cdata = NULL;
         GNUNET_free (ent);
         rlen = clen + sizeof (struct MetaDataHeader);
       }
@@ -898,7 +898,10 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData
       }
       if (NULL != *target)
       {
-        memcpy (*target, dst, clen + sizeof (struct MetaDataHeader));
+        if (GNUNET_YES == comp)
+          memcpy (*target, dst, clen + sizeof (struct MetaDataHeader));
+        else
+          memcpy (*target, dst, left + sizeof (struct MetaDataHeader));
         GNUNET_free (dst);
       }
       else
@@ -923,6 +926,10 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData
       left -= strlen (pos->plugin_name) + 1;
     if (NULL != pos->mime_type)
       left -= strlen (pos->mime_type) + 1;
+
+    GNUNET_free_non_null (cdata);
+    cdata = NULL;
+
     i++;
   }
   GNUNET_free (ent);