aboutsummaryrefslogtreecommitdiff
path: root/src/util/container_meta_data.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2010-05-04 14:20:32 +0000
committerChristian Grothoff <christian@grothoff.org>2010-05-04 14:20:32 +0000
commitaf252789c772264032750979f5a6b1a23bdce02a (patch)
treee0addb83f06be36dc04c70bc81d41c2eca753764 /src/util/container_meta_data.c
parent7cb33da123f130f750f7d77f61c628acfab1e34f (diff)
downloadgnunet-af252789c772264032750979f5a6b1a23bdce02a.tar.gz
gnunet-af252789c772264032750979f5a6b1a23bdce02a.zip
fix bus error
Diffstat (limited to 'src/util/container_meta_data.c')
-rw-r--r--src/util/container_meta_data.c59
1 files changed, 31 insertions, 28 deletions
diff --git a/src/util/container_meta_data.c b/src/util/container_meta_data.c
index 793719fdc..e9c33bab2 100644
--- a/src/util/container_meta_data.c
+++ b/src/util/container_meta_data.c
@@ -821,8 +821,10 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData
821{ 821{
822 struct GNUNET_CONTAINER_MetaData *vmd; 822 struct GNUNET_CONTAINER_MetaData *vmd;
823 struct MetaItem *pos; 823 struct MetaItem *pos;
824 struct MetaDataHeader ihdr;
824 struct MetaDataHeader *hdr; 825 struct MetaDataHeader *hdr;
825 struct MetaDataEntry *ent; 826 struct MetaDataEntry *ent;
827 char *dst;
826 unsigned int i; 828 unsigned int i;
827 uint64_t msize; 829 uint64_t msize;
828 size_t off; 830 size_t off;
@@ -833,13 +835,14 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData
833 size_t size; 835 size_t size;
834 size_t left; 836 size_t left;
835 size_t clen; 837 size_t clen;
838 size_t rlen;
836 int comp; 839 int comp;
837 840
838 if (max < sizeof (struct MetaDataHeader)) 841 if (max < sizeof (struct MetaDataHeader))
839 return GNUNET_SYSERR; /* far too small */ 842 return GNUNET_SYSERR; /* far too small */
840 if (md == NULL) 843 if (md == NULL)
841 return 0; 844 return 0;
842 845
843 if (md->sbuf != NULL) 846 if (md->sbuf != NULL)
844 { 847 {
845 /* try to use serialization cache */ 848 /* try to use serialization cache */
@@ -856,8 +859,7 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData
856 return GNUNET_SYSERR; /* can say that this will fail */ 859 return GNUNET_SYSERR; /* can say that this will fail */
857 /* need to compute a partial serialization, sbuf useless ... */ 860 /* need to compute a partial serialization, sbuf useless ... */
858 } 861 }
859 862 dst = NULL;
860
861 msize = 0; 863 msize = 0;
862 pos = md->items; 864 pos = md->items;
863 while (NULL != pos) 865 while (NULL != pos)
@@ -965,39 +967,43 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData
965 /* success, this now fits! */ 967 /* success, this now fits! */
966 if (GNUNET_YES == comp) 968 if (GNUNET_YES == comp)
967 { 969 {
968 hdr = (struct MetaDataHeader*) *target; 970 if (dst == NULL)
969 if (hdr == NULL) 971 dst = GNUNET_malloc (clen + sizeof (struct MetaDataHeader));
970 { 972 hdr = (struct MetaDataHeader*) dst;
971 hdr = GNUNET_malloc (clen + sizeof (struct MetaDataHeader));
972 *target = (char*) hdr;
973 }
974 hdr->version = htonl (2 | HEADER_COMPRESSED); 973 hdr->version = htonl (2 | HEADER_COMPRESSED);
975 hdr->size = htonl (left); 974 hdr->size = htonl (left);
976 hdr->entries = htonl (md->item_count - i); 975 hdr->entries = htonl (md->item_count - i);
977 memcpy (&(*target)[sizeof(struct MetaDataHeader)], 976 memcpy (&dst[sizeof(struct MetaDataHeader)],
978 cdata, 977 cdata,
979 clen); 978 clen);
980 GNUNET_free (cdata); 979 GNUNET_free (cdata);
981 GNUNET_free (ent); 980 GNUNET_free (ent);
982 return clen + sizeof (struct MetaDataHeader); 981 rlen = clen + sizeof (struct MetaDataHeader);
983 } 982 }
984 else 983 else
985 { 984 {
986 hdr = (struct MetaDataHeader*) *target; 985 if (dst == NULL)
987 if (hdr == NULL) 986 dst = GNUNET_malloc (left + sizeof (struct MetaDataHeader));
988 { 987 hdr = (struct MetaDataHeader*) dst;
989 hdr = GNUNET_malloc (left + sizeof (struct MetaDataHeader));
990 *target = (char*) hdr;
991 }
992 hdr->version = htonl (2); 988 hdr->version = htonl (2);
993 hdr->entries = htonl (md->item_count - i); 989 hdr->entries = htonl (md->item_count - i);
994 hdr->size = htonl (left); 990 hdr->size = htonl (left);
995 memcpy (&(*target)[sizeof(struct MetaDataHeader)], 991 memcpy (&dst[sizeof(struct MetaDataHeader)],
996 &ent[i], 992 &ent[i],
997 left); 993 left);
998 GNUNET_free (ent); 994 GNUNET_free (ent);
999 return left + sizeof (struct MetaDataHeader); 995 rlen = left + sizeof (struct MetaDataHeader);
996 }
997 if (NULL != *target)
998 {
999 memcpy (*target, dst, clen + sizeof (struct MetaDataHeader));
1000 GNUNET_free (dst);
1000 } 1001 }
1002 else
1003 {
1004 *target = dst;
1005 }
1006 return rlen;
1001 } 1007 }
1002 1008
1003 if (0 == (opt & GNUNET_CONTAINER_META_DATA_SERIALIZE_PART)) 1009 if (0 == (opt & GNUNET_CONTAINER_META_DATA_SERIALIZE_PART))
@@ -1021,15 +1027,12 @@ GNUNET_CONTAINER_meta_data_serialize (const struct GNUNET_CONTAINER_MetaData
1021 GNUNET_free (ent); 1027 GNUNET_free (ent);
1022 1028
1023 /* nothing fit, only write header! */ 1029 /* nothing fit, only write header! */
1024 hdr = (struct MetaDataHeader*) *target; 1030 ihdr.version = htonl (2);
1025 if (hdr == NULL) 1031 ihdr.entries = htonl (0);
1026 { 1032 ihdr.size = htonl (0);
1027 hdr = GNUNET_malloc (sizeof (struct MetaDataHeader)); 1033 if (*target == NULL)
1028 *target = (char*) hdr; 1034 *target = GNUNET_malloc (sizeof (struct MetaDataHeader));
1029 } 1035 memcpy (*target, &ihdr, sizeof (struct MetaDataHeader));
1030 hdr->version = htonl (2);
1031 hdr->entries = htonl (0);
1032 hdr->size = htonl (0);
1033 return sizeof (struct MetaDataHeader); 1036 return sizeof (struct MetaDataHeader);
1034} 1037}
1035 1038