[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r11183 - gnunet/src/util
From: |
gnunet |
Subject: |
[GNUnet-SVN] r11183 - gnunet/src/util |
Date: |
Tue, 4 May 2010 16:20:32 +0200 |
Author: grothoff
Date: 2010-05-04 16:20:32 +0200 (Tue, 04 May 2010)
New Revision: 11183
Modified:
gnunet/src/util/container_meta_data.c
Log:
fix bus error
Modified: gnunet/src/util/container_meta_data.c
===================================================================
--- gnunet/src/util/container_meta_data.c 2010-05-04 13:27:18 UTC (rev
11182)
+++ gnunet/src/util/container_meta_data.c 2010-05-04 14:20:32 UTC (rev
11183)
@@ -821,8 +821,10 @@
{
struct GNUNET_CONTAINER_MetaData *vmd;
struct MetaItem *pos;
+ struct MetaDataHeader ihdr;
struct MetaDataHeader *hdr;
struct MetaDataEntry *ent;
+ char *dst;
unsigned int i;
uint64_t msize;
size_t off;
@@ -833,13 +835,14 @@
size_t size;
size_t left;
size_t clen;
+ size_t rlen;
int comp;
if (max < sizeof (struct MetaDataHeader))
return GNUNET_SYSERR; /* far too small */
if (md == NULL)
return 0;
-
+
if (md->sbuf != NULL)
{
/* try to use serialization cache */
@@ -856,8 +859,7 @@
return GNUNET_SYSERR; /* can say that this will fail */
/* need to compute a partial serialization, sbuf useless ... */
}
-
-
+ dst = NULL;
msize = 0;
pos = md->items;
while (NULL != pos)
@@ -965,39 +967,43 @@
/* success, this now fits! */
if (GNUNET_YES == comp)
{
- hdr = (struct MetaDataHeader*) *target;
- if (hdr == NULL)
- {
- hdr = GNUNET_malloc (clen + sizeof (struct MetaDataHeader));
- *target = (char*) hdr;
- }
+ if (dst == NULL)
+ dst = GNUNET_malloc (clen + sizeof (struct MetaDataHeader));
+ hdr = (struct MetaDataHeader*) dst;
hdr->version = htonl (2 | HEADER_COMPRESSED);
hdr->size = htonl (left);
hdr->entries = htonl (md->item_count - i);
- memcpy (&(*target)[sizeof(struct MetaDataHeader)],
+ memcpy (&dst[sizeof(struct MetaDataHeader)],
cdata,
clen);
GNUNET_free (cdata);
GNUNET_free (ent);
- return clen + sizeof (struct MetaDataHeader);
+ rlen = clen + sizeof (struct MetaDataHeader);
}
else
{
- hdr = (struct MetaDataHeader*) *target;
- if (hdr == NULL)
- {
- hdr = GNUNET_malloc (left + sizeof (struct MetaDataHeader));
- *target = (char*) hdr;
- }
+ if (dst == NULL)
+ dst = GNUNET_malloc (left + sizeof (struct MetaDataHeader));
+ hdr = (struct MetaDataHeader*) dst;
hdr->version = htonl (2);
hdr->entries = htonl (md->item_count - i);
hdr->size = htonl (left);
- memcpy (&(*target)[sizeof(struct MetaDataHeader)],
+ memcpy (&dst[sizeof(struct MetaDataHeader)],
&ent[i],
left);
GNUNET_free (ent);
- return left + sizeof (struct MetaDataHeader);
+ rlen = left + sizeof (struct MetaDataHeader);
}
+ if (NULL != *target)
+ {
+ memcpy (*target, dst, clen + sizeof (struct MetaDataHeader));
+ GNUNET_free (dst);
+ }
+ else
+ {
+ *target = dst;
+ }
+ return rlen;
}
if (0 == (opt & GNUNET_CONTAINER_META_DATA_SERIALIZE_PART))
@@ -1021,15 +1027,12 @@
GNUNET_free (ent);
/* nothing fit, only write header! */
- hdr = (struct MetaDataHeader*) *target;
- if (hdr == NULL)
- {
- hdr = GNUNET_malloc (sizeof (struct MetaDataHeader));
- *target = (char*) hdr;
- }
- hdr->version = htonl (2);
- hdr->entries = htonl (0);
- hdr->size = htonl (0);
+ ihdr.version = htonl (2);
+ ihdr.entries = htonl (0);
+ ihdr.size = htonl (0);
+ if (*target == NULL)
+ *target = GNUNET_malloc (sizeof (struct MetaDataHeader));
+ memcpy (*target, &ihdr, sizeof (struct MetaDataHeader));
return sizeof (struct MetaDataHeader);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r11183 - gnunet/src/util,
gnunet <=