From ab700c23613c8f1df85fe17134a93782d2bd42a2 Mon Sep 17 00:00:00 2001 From: Martin Schanzenbach Date: Mon, 19 Mar 2012 12:20:30 +0000 Subject: [PATCH] -fix mx records postprocessing --- src/gns/gnunet-service-gns_interceptor.c | 21 ++++++++++++-- src/gns/gnunet-service-gns_resolver.c | 36 +++++++++++++++++++++--- src/gns/test_gns_simple_mx_lookup.c | 21 ++++++++++---- 3 files changed, 66 insertions(+), 12 deletions(-) diff --git a/src/gns/gnunet-service-gns_interceptor.c b/src/gns/gnunet-service-gns_interceptor.c index 25cad7ead..4160893ad 100644 --- a/src/gns/gnunet-service-gns_interceptor.c +++ b/src/gns/gnunet-service-gns_interceptor.c @@ -114,8 +114,25 @@ reply_to_dns(void* cls, uint32_t rd_count, { answer_records[i].name = ilh->query->name; answer_records[i].type = rd[i].record_type; - answer_records[i].data.raw.data_len = rd[i].data_size; - answer_records[i].data.raw.data = (char*)rd[i].data; + switch(rd[i].record_type) + { + case GNUNET_GNS_RECORD_TYPE_NS: + case GNUNET_GNS_RECORD_TYPE_CNAME: + case GNUNET_GNS_RECORD_TYPE_PTR: + answer_records[i].data.hostname = (char*)rd[i].data; + break; + case GNUNET_GNS_RECORD_TYPE_SOA: + answer_records[i].data.soa = + (struct GNUNET_DNSPARSER_SoaRecord *)rd[i].data; + break; + case GNUNET_GNS_RECORD_MX: + answer_records[i].data.mx = + (struct GNUNET_DNSPARSER_MxRecord *)rd[i].data; + break; + default: + answer_records[i].data.raw.data_len = rd[i].data_size; + answer_records[i].data.raw.data = (char*)rd[i].data; + } answer_records[i].expiration_time = rd[i].expiration; answer_records[i].class = GNUNET_DNSPARSER_CLASS_INTERNET;//hmmn } diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c index f30f67b57..077dca039 100644 --- a/src/gns/gnunet-service-gns_resolver.c +++ b/src/gns/gnunet-service-gns_resolver.c @@ -954,10 +954,12 @@ finish_lookup(struct ResolverHandle *rh, int i; char* s_value; char new_s_value[256]; + char new_mx_value[sizeof(struct GNUNET_DNSPARSER_MxRecord)+256]; int s_len; struct GNUNET_NAMESTORE_RecordData p_rd[rd_count]; char* pos; char* trailer; + struct GNUNET_DNSPARSER_MxRecord *mx; if (rd_count > 0) memcpy(p_rd, rd, rd_count*sizeof(struct GNUNET_NAMESTORE_RecordData)); @@ -978,11 +980,21 @@ finish_lookup(struct ResolverHandle *rh, * also try to resolve the A/AAAA records (RFC1035) * FIXME */ - s_value = (char*)rd[i].data; - s_len = rd[i].data_size; + if (rd[i].record_type == GNUNET_GNS_RECORD_MX) + { + mx = (struct GNUNET_DNSPARSER_MxRecord*)rd[i].data; + s_value = (char*)&mx[1]; + } + else + { + s_value = (char*)rd[i].data; + } + + s_len = strlen(s_value)+1; if (s_len < 3) { + /* no postprocessing */ p_rd[i].data = rd[i].data; continue; } @@ -1007,8 +1019,24 @@ finish_lookup(struct ResolverHandle *rh, pos = new_s_value+s_len-2; strcpy(pos, trailer); pos += strlen(trailer); - p_rd[i].data = new_s_value; - p_rd[i].data_size = strlen(new_s_value)+1; + if (rd[i].record_type == GNUNET_GNS_RECORD_MX) + { + + p_rd[i].data_size = sizeof(struct GNUNET_DNSPARSER_MxRecord) + +strlen(new_s_value)+1; + + p_rd[i].data = new_mx_value; + mx = (struct GNUNET_DNSPARSER_MxRecord*)p_rd[i].data; + mx->preference = + ((struct GNUNET_DNSPARSER_MxRecord*)rd[i].data)->preference; + memcpy((char*)&mx[1], new_s_value, strlen(new_s_value)+1); + mx->mxhost = (char*)&mx[1]; + } + else + { + p_rd[i].data = new_s_value; + p_rd[i].data_size = strlen(new_s_value)+1; + } GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Expanded to %s\n", new_s_value); } diff --git a/src/gns/test_gns_simple_mx_lookup.c b/src/gns/test_gns_simple_mx_lookup.c index 1f39b175f..7f854c6f3 100644 --- a/src/gns/test_gns_simple_mx_lookup.c +++ b/src/gns/test_gns_simple_mx_lookup.c @@ -97,7 +97,7 @@ on_lookup_result(void *cls, uint32_t rd_count, char* addr; int mx_found = 0; int ip_found = 0; - char* mx; + struct GNUNET_DNSPARSER_MxRecord *mx; if (rd_count == 0) { @@ -126,8 +126,11 @@ on_lookup_result(void *cls, uint32_t rd_count, } else if (rd[i].record_type == GNUNET_GNS_RECORD_MX) { - mx = (char*)rd[i].data; - if (0 == strcmp(mx, TEST_EXPECTED_MX)) + mx = (struct GNUNET_DNSPARSER_MxRecord*)rd[i].data; + mx->mxhost = (char*)&mx[1]; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Got MX %s\n", mx->mxhost); + if (0 == strcmp(mx->mxhost, TEST_EXPECTED_MX)) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "%s correctly resolved to %s!\n", TEST_DOMAIN, @@ -250,6 +253,7 @@ do_lookup(void *cls, const struct GNUNET_PeerIdentity *id, struct GNUNET_NAMESTORE_RecordData rd; char* ip = TEST_IP; struct in_addr *mail = GNUNET_malloc(sizeof(struct in_addr)); + struct GNUNET_DNSPARSER_MxRecord *mx_record; rd.expiration = GNUNET_TIME_absolute_get_forever (); GNUNET_assert(1 == inet_pton (AF_INET, ip, mail)); @@ -283,9 +287,13 @@ do_lookup(void *cls, const struct GNUNET_PeerIdentity *id, sig, NULL, NULL); - - rd.data_size = strlen(TEST_MX_NAME)+1; - rd.data = TEST_MX_NAME; + + rd.data_size = sizeof(struct GNUNET_DNSPARSER_MxRecord)+strlen(TEST_MX_NAME)+1; + mx_record = GNUNET_malloc(rd.data_size); + mx_record->preference = 1; + mx_record->mxhost = (char*)&mx_record[1]; + strcpy(mx_record->mxhost, TEST_MX_NAME); + rd.data = mx_record; rd.record_type = GNUNET_GNS_RECORD_MX; sig = GNUNET_NAMESTORE_create_signature(bob_key, GNUNET_TIME_absolute_get_forever(), @@ -300,6 +308,7 @@ do_lookup(void *cls, const struct GNUNET_PeerIdentity *id, sig, &commence_testing, NULL); + GNUNET_free(mx_record); GNUNET_free(mail); GNUNET_free(sig); GNUNET_CRYPTO_rsa_key_free(bob_key); -- 2.25.1