From ddefc2b2e4b461cf8beae38ebda30ee8711cd5d2 Mon Sep 17 00:00:00 2001 From: Martin Schanzenbach Date: Sat, 16 Jun 2012 19:22:49 +0000 Subject: [PATCH] -proper data layout vpn record --- src/gns/gnunet-service-gns_resolver.c | 15 ++++++++-- src/namestore/namestore_common.c | 43 +++++++++++++++++++++------ 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c index 7ce45e651..0753125d4 100644 --- a/src/gns/gnunet-service-gns_resolver.c +++ b/src/gns/gnunet-service-gns_resolver.c @@ -1593,6 +1593,8 @@ resolve_record_vpn (struct ResolverHandle *rh, struct GNUNET_CRYPTO_HashAsciiEncoded s_pid; struct GNUNET_HashCode serv_desc; struct GNUNET_CRYPTO_HashAsciiEncoded s_sd; + char* pos; + size_t len = (sizeof (uint32_t) * 2) + (sizeof (struct GNUNET_HashCode) * 2); /* We cancel here as to not include the ns lookup in the timeout */ if (rh->timeout_task != GNUNET_SCHEDULER_NO_TASK) @@ -1611,8 +1613,7 @@ resolve_record_vpn (struct ResolverHandle *rh, } /* Extracting VPN information FIXME rd parsing with NS API?*/ - if (4 != SSCANF ((char*)rd, "%d:%d:%s:%s", &af, &proto, - (char*)&s_pid, (char*)&s_sd)) + if (len != rd->data_size) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "GNS_PHASE_REC_VPN-%llu: Error parsing VPN RR!\n", @@ -1621,6 +1622,16 @@ resolve_record_vpn (struct ResolverHandle *rh, return; } + pos = (char*)rd; + memcpy (&af, pos, sizeof (uint32_t)); + pos += sizeof (uint32_t); + memcpy (&proto, pos, sizeof (uint32_t)); + pos += sizeof (uint32_t); + memcpy (&s_pid, pos, sizeof (struct GNUNET_HashCode)); + pos += sizeof (struct GNUNET_HashCode); + memcpy (&s_sd, pos, sizeof (struct GNUNET_HashCode)); + + if ((GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_pid, &peer_id)) || (GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_sd, &serv_desc))) { diff --git a/src/namestore/namestore_common.c b/src/namestore/namestore_common.c index 15a48cf36..2b34a84e7 100644 --- a/src/namestore/namestore_common.c +++ b/src/namestore/namestore_common.c @@ -319,6 +319,13 @@ GNUNET_NAMESTORE_value_to_string (uint32_t type, uint32_t soa_retry; uint32_t soa_expire; uint32_t soa_min; + uint32_t *af; + uint32_t *proto; + char* vpn_str; + struct GNUNET_HashCode *h_peer; + struct GNUNET_HashCode *h_serv; + struct GNUNET_CRYPTO_HashAsciiEncoded s_peer; + struct GNUNET_CRYPTO_HashAsciiEncoded s_serv; switch (type) { @@ -377,7 +384,16 @@ GNUNET_NAMESTORE_value_to_string (uint32_t type, case GNUNET_NAMESTORE_TYPE_LEHO: return GNUNET_strndup (data, data_size); case GNUNET_NAMESTORE_TYPE_VPN: - return GNUNET_strndup (data, data_size); + af = (uint32_t*)data; + proto = (uint32_t*)((char*)af + sizeof (uint32_t)); + h_peer = (struct GNUNET_HashCode*)((char*)proto + sizeof (struct GNUNET_HashCode)); + h_serv = (struct GNUNET_HashCode*)((char*)h_peer + sizeof (struct GNUNET_HashCode)); + + GNUNET_CRYPTO_hash_to_enc (h_peer, &s_peer); + GNUNET_CRYPTO_hash_to_enc (h_serv, &s_serv); + if (GNUNET_OK != GNUNET_asprintf (&vpn_str, "%d:%d:%s:%s", af, proto, (char*)&s_peer, (char*)&s_serv)) + return NULL; + return vpn_str; default: GNUNET_break (0); } @@ -416,11 +432,12 @@ GNUNET_NAMESTORE_string_to_value (uint32_t type, uint32_t soa_retry; uint32_t soa_expire; uint32_t soa_min; - struct GNUNET_HashCode hash; + struct GNUNET_HashCode *h_peer; + struct GNUNET_HashCode *h_serv; struct GNUNET_CRYPTO_HashAsciiEncoded s_peer; struct GNUNET_CRYPTO_HashAsciiEncoded s_serv; - int af; - int proto; + uint32_t* af; + uint32_t* proto; switch (type) { @@ -503,18 +520,26 @@ GNUNET_NAMESTORE_string_to_value (uint32_t type, *data_size = strlen (s); return GNUNET_OK; case GNUNET_NAMESTORE_TYPE_VPN: + + *data_size = sizeof (uint32_t) * 2; + *data_size += sizeof (struct GNUNET_HashCode) * 2; + *data = GNUNET_malloc (*data_size); + af = (uint32_t*)(*data); + proto = (uint32_t*) ((char*)af + sizeof (uint32_t)); + h_peer = (struct GNUNET_HashCode*)((char*)proto + sizeof (uint32_t)); + h_serv = (struct GNUNET_HashCode*)((char*)h_peer + sizeof (struct GNUNET_HashCode)); + if (4 != SSCANF (s,"%d:%d:%s:%s", - &af, &proto, (char*)&s_peer, (char*)&s_serv)) + af, proto, (char*)&s_peer, (char*)&s_serv)) { return GNUNET_SYSERR; } - if ((GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_peer, &hash)) || - (GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_serv, &hash))) + if ((GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_peer, h_peer)) || + (GNUNET_OK != GNUNET_CRYPTO_hash_from_string ((char*)&s_serv, h_serv))) { + GNUNET_free (*data); return GNUNET_SYSERR; } - *data = GNUNET_strdup (s); - *data_size = strlen (s); return GNUNET_OK; default: GNUNET_break (0); -- 2.25.1