diff options
author | Christian Grothoff <christian@grothoff.org> | 2010-05-04 14:20:32 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2010-05-04 14:20:32 +0000 |
commit | af252789c772264032750979f5a6b1a23bdce02a (patch) | |
tree | e0addb83f06be36dc04c70bc81d41c2eca753764 /src/util/container_meta_data.c | |
parent | 7cb33da123f130f750f7d77f61c628acfab1e34f (diff) | |
download | gnunet-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.c | 59 |
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 | ||