From: Matthias Wachs Date: Wed, 29 Feb 2012 19:21:45 +0000 (+0000) Subject: - namestore X-Git-Tag: initial-import-from-subversion-38251~14535 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=3ca1463193aadba06be89135c7a0ab34a3052de3;p=oweals%2Fgnunet.git - namestore --- diff --git a/src/namestore/Makefile.am b/src/namestore/Makefile.am index 39765b496..2e2f08042 100644 --- a/src/namestore/Makefile.am +++ b/src/namestore/Makefile.am @@ -27,6 +27,7 @@ check_PROGRAMS = \ test_namestore_api \ test_namestore_api_put \ test_namestore_api_lookup \ + test_namestore_api_create \ test_namestore_api_zone_iteration \ test_namestore_record_serialization @@ -93,6 +94,12 @@ test_namestore_api_lookup_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/namestore/libgnunetnamestore.la +test_namestore_api_create_SOURCES = \ + test_namestore_api_create.c +test_namestore_api_create_LDADD = \ + $(top_builddir)/src/util/libgnunetutil.la \ + $(top_builddir)/src/namestore/libgnunetnamestore.la + test_namestore_api_zone_iteration_SOURCES = \ test_namestore_api_zone_iteration.c test_namestore_api_zone_iteration_LDADD = \ diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c index 1fbf108d2..0b85733ce 100644 --- a/src/namestore/gnunet-service-namestore.c +++ b/src/namestore/gnunet-service-namestore.c @@ -28,6 +28,7 @@ #include "gnunet_service_lib.h" #include "gnunet_namestore_service.h" #include "gnunet_namestore_plugin.h" +#include "gnunet_signatures.h" #include "namestore.h" @@ -262,6 +263,7 @@ handle_lookup_name_it (void *cls, rd_selected = NULL; rd_ser = NULL; rd_ser_len = 0; + expire = GNUNET_TIME_UNIT_ZERO_ABS; } if ((copied_elements == rd_count) && (signature != NULL)) @@ -281,7 +283,7 @@ handle_lookup_name_it (void *cls, lnr_msg->header.type = ntohs (GNUNET_MESSAGE_TYPE_NAMESTORE_LOOKUP_NAME_RESPONSE); lnr_msg->header.size = ntohs (r_size); lnr_msg->op_id = htonl (lnc->id); - lnr_msg->rd_len = htonl (rd_ser_len); + lnr_msg->rd_len = htons (rd_ser_len); lnr_msg->name_len = htons (name_len); lnr_msg->expire = GNUNET_TIME_absolute_hton(expire); lnr_msg->contains_sig = htons (contains_signature); @@ -383,6 +385,7 @@ static void handle_record_put (void *cls, size_t name_len; size_t msg_size; size_t msg_size_exp; + size_t key_len; char * name; char * rd_ser; uint32_t id = 0; @@ -406,11 +409,13 @@ static void handle_record_put (void *cls, } struct RecordPutMessage * rp_msg = (struct RecordPutMessage *) message; + id = ntohl (rp_msg->op_id); + key_len = sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded); name_len = ntohs (rp_msg->name_len); rd_ser_len = ntohs(rp_msg->rd_len); msg_size = ntohs (message->size); - msg_size_exp = sizeof (struct RecordPutMessage) + sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) + name_len + rd_ser_len; + msg_size_exp = sizeof (struct RecordPutMessage) + key_len + name_len + rd_ser_len; if (msg_size != msg_size_exp) { @@ -429,7 +434,7 @@ static void handle_record_put (void *cls, } zone_key = (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *) &rp_msg[1]; - name = (char *) &zone_key[1]; + name = &((char *)zone_key)[key_len]; if (name[name_len -1] != '\0') { @@ -443,6 +448,11 @@ static void handle_record_put (void *cls, rd_ser = &name[name_len]; rd_count = GNUNET_NAMESTORE_records_deserialize(&rd, rd_ser, rd_ser_len); + GNUNET_HashCode zone_hash; + GNUNET_CRYPTO_hash (zone_key, key_len, &zone_hash); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "PUT ZONE HASH: `%s'\n", GNUNET_h2s_full(&zone_hash)); + + /* Database operation */ res = GSN_database->put_records(GSN_database->cls, zone_key, @@ -471,6 +481,84 @@ static void handle_record_put (void *cls, GNUNET_SERVER_receive_done (client, GNUNET_OK); } +struct CreateRecordContext +{ + struct GNUNET_NAMESTORE_RecordData *rd; + struct GNUNET_CRYPTO_RsaPrivateKey *pkey; + struct GNUNET_TIME_Absolute expire; + uint32_t op_id; + struct GNUNET_NAMESTORE_Client *nc; +}; + +struct GNUNET_CRYPTO_RsaSignature * +GNUNET_NAMESTORE_create_signature (const struct GNUNET_CRYPTO_RsaPrivateKey *key, struct GNUNET_NAMESTORE_RecordData *rd, unsigned int rd_count) +{ + struct GNUNET_CRYPTO_RsaSignature *sig = GNUNET_malloc(sizeof (struct GNUNET_CRYPTO_RsaSignature)); + struct GNUNET_CRYPTO_RsaSignaturePurpose *sig_purpose; + size_t rd_ser_len; + char *rd_ser; + + rd_ser_len = GNUNET_NAMESTORE_records_serialize(&rd_ser, rd_count, rd); + sig_purpose = GNUNET_malloc(sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) + rd_ser_len); + + sig_purpose->size = htonl (sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose)+ rd_ser_len); + sig_purpose->purpose = htonl (GNUNET_SIGNATURE_PURPOSE_GNS_RECORD_SIGN); + memcpy (&sig_purpose[1], rd_ser, rd_ser_len); + + GNUNET_CRYPTO_rsa_sign (key, sig_purpose, sig); + + GNUNET_free (rd_ser); + GNUNET_free (sig_purpose); + return sig; +} + +static void +handle_create_record_it (void *cls, + const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *zone_key, + struct GNUNET_TIME_Absolute expire, + const char *name, + unsigned int rd_count, + const struct GNUNET_NAMESTORE_RecordData *rd, + const struct GNUNET_CRYPTO_RsaSignature *signature) +{ + struct CreateRecordContext * crc = cls; + struct GNUNET_CRYPTO_RsaSignature *signature_new; + struct RecordCreateResponseMessage rcr_msg; + int res; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Found %u existing records for `%s'\n", rd_count, name); + struct GNUNET_NAMESTORE_RecordData *rd_new = GNUNET_malloc ((rd_count+1) * sizeof (struct GNUNET_NAMESTORE_RecordData)); + memcpy (rd_new, rd, rd_count * sizeof (struct GNUNET_NAMESTORE_RecordData)); + + rd_new[rd_count] = *(crc->rd); + + signature_new = GNUNET_NAMESTORE_create_signature (crc->pkey, rd_new, rd_count+1); + + /* Database operation */ + res = GSN_database->put_records(GSN_database->cls, + zone_key, + expire, + name, + rd_count +1, rd_new, + signature_new); + + GNUNET_free (rd_new); + GNUNET_free (signature_new); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Update result for name %u\n", res); + /* Send response */ + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message\n", "RECORD_CREATE_RESPONSE"); + rcr_msg.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_CREATE_RESPONSE); + rcr_msg.op_id = htonl (crc->op_id); + rcr_msg.header.size = htons (sizeof (struct RecordCreateResponseMessage)); + if (GNUNET_OK == res) + rcr_msg.op_result = htons (GNUNET_OK); + else + rcr_msg.op_result = htons (GNUNET_NO); + GNUNET_SERVER_notification_context_unicast (snc, crc->nc->client, (const struct GNUNET_MessageHeader *) &rcr_msg, GNUNET_NO); + +} static void handle_record_create (void *cls, struct GNUNET_SERVER_Client * client, @@ -478,11 +566,21 @@ static void handle_record_create (void *cls, { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received `%s' message\n", "NAMESTORE_RECORD_CREATE"); struct GNUNET_NAMESTORE_Client *nc; - struct RecordCreateResponseMessage rcr_msg; + struct GNUNET_NAMESTORE_RecordData *rd; + struct CreateRecordContext crc; + struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pub; + GNUNET_HashCode pubkey_hash; size_t name_len; size_t msg_size; size_t msg_size_exp; + size_t rd_ser_len; + size_t key_len; uint32_t id = 0; + char *pkey_tmp; + char *name_tmp; + char *rd_ser; + int rd_count; + int res = GNUNET_SYSERR; @@ -505,7 +603,9 @@ static void handle_record_create (void *cls, id = ntohl (rp_msg->op_id); name_len = ntohs (rp_msg->name_len); msg_size = ntohs (message->size); - msg_size_exp = sizeof (struct RecordCreateMessage) + name_len + sizeof (struct GNUNET_NAMESTORE_RecordData); + rd_ser_len = ntohs (rp_msg->rd_len); + key_len = ntohs (rp_msg->pkey_len); + msg_size_exp = sizeof (struct RecordCreateMessage) + key_len + name_len + rd_ser_len; if (msg_size != msg_size_exp) { @@ -515,38 +615,49 @@ static void handle_record_create (void *cls, return; } - if ((name_len == 0) || (name_len > 256)) { GNUNET_break_op (0); GNUNET_SERVER_receive_done (client, GNUNET_OK); return; } -/* - if (name[name_len -1] != '\0') + + pkey_tmp = (char *) &rp_msg[1]; + name_tmp = &pkey_tmp[key_len]; + rd_ser = &name_tmp[name_len]; + + if (name_tmp[name_len -1] != '\0') { GNUNET_break_op (0); GNUNET_SERVER_receive_done (client, GNUNET_OK); return; } -*/ - /* DO WORK HERE */ - /* Send response */ + rd_count = GNUNET_NAMESTORE_records_deserialize(&rd, rd_ser, rd_ser_len); + GNUNET_assert (rd_count == 1); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message\n", "RECORD_CREATE_RESPONSE"); - rcr_msg.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_CREATE_RESPONSE); - rcr_msg.op_id = rp_msg->op_id; - rcr_msg.header.size = htons (sizeof (struct RecordCreateResponseMessage)); - if (GNUNET_OK == res) - rcr_msg.op_result = htons (GNUNET_OK); - else - rcr_msg.op_result = htons (GNUNET_NO); - GNUNET_SERVER_notification_context_unicast (snc, nc->client, (const struct GNUNET_MessageHeader *) &rcr_msg, GNUNET_NO); + /* Extracting and converting private key */ + struct GNUNET_CRYPTO_RsaPrivateKey *pkey = GNUNET_CRYPTO_rsa_decode_key((char *) pkey_tmp, key_len); + GNUNET_assert (pkey != NULL); + GNUNET_CRYPTO_rsa_key_get_public(pkey, &pub); + GNUNET_CRYPTO_hash (&pub, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), &pubkey_hash); + + crc.pkey = pkey; + crc.rd = rd; + crc.nc = nc; + crc.op_id = id; + + /* Get existing records for name */ + res = GSN_database->iterate_records(GSN_database->cls, &pubkey_hash, name_tmp, 0, &handle_create_record_it, &crc); + + GNUNET_CRYPTO_rsa_key_free(pkey); + GNUNET_NAMESTORE_records_free(rd_count, rd); GNUNET_SERVER_receive_done (client, GNUNET_OK); } + + static void handle_record_remove (void *cls, struct GNUNET_SERVER_Client * client, const struct GNUNET_MessageHeader * message) @@ -712,7 +823,6 @@ static void handle_iteration_start (void *cls, GNUNET_CONTAINER_DLL_insert (nc->op_head, nc->op_tail, zi); res = GSN_database->iterate_records (GSN_database->cls, &zis_msg->zone, NULL, zi->offset , &zone_iteration_proc, &zipr); - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "iterate_records result %u\n", res); switch (res) { case GNUNET_OK: /* GNUNET_OK on success */ diff --git a/src/namestore/namestore.h b/src/namestore/namestore.h index 14a13801a..760d491e2 100644 --- a/src/namestore/namestore.h +++ b/src/namestore/namestore.h @@ -171,7 +171,7 @@ struct LookupNameResponseMessage uint16_t contains_sig; /* Requested record type */ - uint32_t rd_len; + uint16_t rd_len; }; GNUNET_NETWORK_STRUCT_END @@ -202,6 +202,9 @@ struct RecordPutMessage /* Length of serialized rd data */ uint16_t rd_len; + /* Length of pubkey */ + uint16_t key_len; + struct GNUNET_TIME_AbsoluteNBO expire; struct GNUNET_CRYPTO_RsaSignature signature; @@ -235,9 +238,9 @@ GNUNET_NETWORK_STRUCT_END /** - * Put a record to the namestore + * Create a record and put it to the namestore * Memory layout: - * [struct RecordPutMessage][struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded][char *name][rc_count * struct GNUNET_NAMESTORE_RecordData] + * [struct RecordCreateMessage][char *name][rc_count * struct GNUNET_NAMESTORE_RecordData] */ GNUNET_NETWORK_STRUCT_BEGIN struct RecordCreateMessage @@ -257,7 +260,11 @@ struct RecordCreateMessage /* name length */ uint16_t name_len; - struct GNUNET_CRYPTO_RsaSignature signature; + /* Record data length */ + uint16_t rd_len; + + /* private key length */ + uint16_t pkey_len; }; GNUNET_NETWORK_STRUCT_END @@ -285,6 +292,8 @@ struct RecordCreateResponseMessage * name length: GNUNET_NO (0) on error, GNUNET_OK (1) on success */ uint16_t op_result; + + }; GNUNET_NETWORK_STRUCT_END diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c index e764c0949..61bd29dc1 100644 --- a/src/namestore/namestore_api.c +++ b/src/namestore/namestore_api.c @@ -27,10 +27,18 @@ #include "platform.h" #include "gnunet_util_lib.h" +#include "gnunet_crypto_lib.h" #include "gnunet_constants.h" #include "gnunet_arm_service.h" #include "gnunet_namestore_service.h" #include "namestore.h" + +#include "platform.h" +#include +#include "gnunet_common.h" +#include "gnunet_crypto_lib.h" +#include "gnunet_disk_lib.h" + #define DEBUG_GNS_API GNUNET_EXTRA_LOGGING #define LOG(kind,...) GNUNET_log_from (kind, "gns-api",__VA_ARGS__) @@ -212,7 +220,7 @@ handle_lookup_name_response (struct GNUNET_NAMESTORE_QueueEntry *qe, int contains_sig = GNUNET_NO; int rd_count = 0; - rd_len = ntohl (msg->rd_len); + rd_len = ntohs (msg->rd_len); msg_len = ntohs (msg->header.size); name_len = ntohs (msg->name_len); contains_sig = ntohs (msg->contains_sig); @@ -749,7 +757,7 @@ GNUNET_NAMESTORE_record_put (struct GNUNET_NAMESTORE_Handle *h, struct PendingMessage *pe; /* pointer to elements */ - struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *zone_key_tmp; + char * zone_key_tmp; char * rd_tmp; char * rd_ser; char * name_tmp; @@ -757,6 +765,7 @@ GNUNET_NAMESTORE_record_put (struct GNUNET_NAMESTORE_Handle *h, size_t msg_size = 0; size_t name_len = 0; size_t rd_ser_len = 0; + size_t pubkey_len = 0; uint32_t id = 0; GNUNET_assert (NULL != h); @@ -782,29 +791,31 @@ GNUNET_NAMESTORE_record_put (struct GNUNET_NAMESTORE_Handle *h, /* set msg_size*/ rd_ser_len = GNUNET_NAMESTORE_records_serialize(&rd_ser, rd_count, rd); - + pubkey_len = sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded); struct RecordPutMessage * msg; - msg_size = sizeof (struct RecordPutMessage) + sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) + name_len + rd_ser_len; + msg_size = sizeof (struct RecordPutMessage) + pubkey_len + name_len + rd_ser_len; /* create msg here */ pe = GNUNET_malloc(sizeof (struct PendingMessage) + msg_size); pe->size = msg_size; pe->is_init = GNUNET_NO; msg = (struct RecordPutMessage *) &pe[1]; - zone_key_tmp = (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *) &msg[1]; - name_tmp = (char *) &zone_key_tmp[1]; + zone_key_tmp = (char *) &msg[1]; + name_tmp = (char *) &zone_key_tmp[pubkey_len]; rd_tmp = &name_tmp[name_len]; msg->header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_PUT); msg->header.size = htons (msg_size); msg->op_id = htonl (id); - memcpy (zone_key_tmp, zone_key, sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded)); + msg->key_len = htons (pubkey_len); + memcpy (zone_key_tmp, zone_key, pubkey_len); msg->signature = *signature; msg->name_len = htons (name_len); memcpy (name_tmp, name, name_len); msg->expire = GNUNET_TIME_absolute_hton (expire); msg->rd_len = htons (rd_ser_len); + memcpy (rd_tmp, rd_ser, rd_ser_len); GNUNET_free (rd_ser); @@ -862,14 +873,26 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, struct GNUNET_NAMESTORE_QueueEntry *qe; struct PendingMessage *pe; char * name_tmp; + char * pkey_tmp; char * rd_tmp; char * rd_ser; size_t rd_ser_len = 0; size_t msg_size = 0; size_t name_len = 0; + size_t key_len = 0; uint32_t id = 0; GNUNET_assert (NULL != h); + GNUNET_assert (NULL != pkey); + GNUNET_assert (NULL != name); + GNUNET_assert (NULL != rd); + + name_len = strlen(name) + 1; + if (name_len > 256) + { + GNUNET_break (0); + return NULL; + } id = get_op_id(h); qe = GNUNET_malloc(sizeof (struct GNUNET_NAMESTORE_QueueEntry)); @@ -877,11 +900,15 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, qe->cont = cont; qe->cont_cls = cont_cls; qe->op_id = id; + GNUNET_CONTAINER_DLL_insert_tail(h->op_head, h->op_tail, qe); /* set msg_size*/ + struct GNUNET_CRYPTO_RsaPrivateKeyBinaryEncoded * pkey_enc = GNUNET_CRYPTO_rsa_encode_key (pkey); + GNUNET_assert (pkey_enc != NULL); + key_len = ntohs (pkey_enc->len); rd_ser_len = GNUNET_NAMESTORE_records_serialize(&rd_ser, 1, rd); struct RecordCreateMessage * msg; - msg_size = sizeof (struct RecordCreateMessage) + name_len + rd_ser_len; + msg_size = sizeof (struct RecordCreateMessage) + key_len + name_len + rd_ser_len; /* create msg here */ pe = GNUNET_malloc(sizeof (struct PendingMessage) + msg_size); @@ -889,17 +916,21 @@ GNUNET_NAMESTORE_record_create (struct GNUNET_NAMESTORE_Handle *h, pe->is_init = GNUNET_NO; msg = (struct RecordCreateMessage *) &pe[1]; - name_tmp = (char *) &msg[1]; + pkey_tmp = (char *) &msg[1]; + name_tmp = &pkey_tmp[key_len]; rd_tmp = &name_tmp[name_len]; msg->header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_CREATE); msg->header.size = htons (msg_size); msg->op_id = htonl (id); - //msg->signature = *signature; msg->name_len = htons (name_len); + msg->rd_len = htons (rd_ser_len); + msg->pkey_len = htons (key_len); + memcpy (pkey_tmp, pkey_enc, key_len); memcpy (name_tmp, name, name_len); memcpy (rd_tmp, rd_ser, rd_ser_len); GNUNET_free (rd_ser); + GNUNET_free (pkey_enc); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for name `%s' with size %u\n", "NAMESTORE_RECORD_CREATE", name, msg_size); diff --git a/src/namestore/test_namestore_api_put.c b/src/namestore/test_namestore_api_put.c index 99f8e25b7..7310946b1 100644 --- a/src/namestore/test_namestore_api_put.c +++ b/src/namestore/test_namestore_api_put.c @@ -41,7 +41,6 @@ static struct GNUNET_OS_Process *arm; static struct GNUNET_CRYPTO_RsaPrivateKey * privkey; static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pubkey; -static GNUNET_HashCode zone; struct GNUNET_NAMESTORE_RecordData *rd; @@ -163,9 +162,6 @@ run (void *cls, char *const *args, const char *cfgfile, /* get public key */ GNUNET_CRYPTO_rsa_key_get_public(privkey, &pubkey); - /* create random zone hash */ - GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, &zone); - struct GNUNET_CRYPTO_RsaSignature signature; start_arm (cfgfile); diff --git a/src/namestore/test_namestore_record_serialization.c b/src/namestore/test_namestore_record_serialization.c index 5ea345bef..cd60a5dda 100644 --- a/src/namestore/test_namestore_record_serialization.c +++ b/src/namestore/test_namestore_record_serialization.c @@ -36,10 +36,10 @@ static void run (void *cls, char *const *args, const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg) { - char * dest = NULL; + char * rd_ser = NULL; size_t len; int c; - int elem = 0; + int dst_elem = 0; int rd_count = 3; size_t data_len; @@ -61,18 +61,18 @@ run (void *cls, char *const *args, const char *cfgfile, } res = 0; - len = GNUNET_NAMESTORE_records_serialize (&dest, rd_count, src); + len = GNUNET_NAMESTORE_records_serialize (&rd_ser, rd_count, src); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Serialized data len: %u\n",len); - GNUNET_assert (dest != NULL); + GNUNET_assert (rd_ser != NULL); - elem = GNUNET_NAMESTORE_records_deserialize(&dst, dest, len); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Deserialized elements: %u\n",elem); + dst_elem = GNUNET_NAMESTORE_records_deserialize(&dst, rd_ser, len); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Deserialized elements: %u\n",dst_elem); - GNUNET_assert (elem == rd_count); + GNUNET_assert (dst_elem == rd_count); GNUNET_assert (dst != NULL); - for (c = 0; c < elem; c++) + for (c = 0; c < dst_elem; c++) { if (src[c].data_size != dst[c].data_size) { @@ -115,12 +115,12 @@ run (void *cls, char *const *args, const char *cfgfile, } GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Element [%i]: EQUAL\n", c); - /* clean up */ - GNUNET_free((char *) dst[c].data); - GNUNET_free((char *) src[c].data); } - GNUNET_free (dest); - GNUNET_free (dst); + + for (c = 0; c < rd_count; c++) + GNUNET_free ((void *) src[c].data); + GNUNET_NAMESTORE_records_free (dst_elem, dst); + GNUNET_free (rd_ser); } static int