diff options
author | Christian Grothoff <christian@grothoff.org> | 2018-05-20 12:51:41 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2018-05-20 12:51:41 +0200 |
commit | 98edad8c6d481091fda3a59d1047762e10fe72c0 (patch) | |
tree | d5ad2187bbd0cbb3014688d8a48349cfb504d21e /src | |
parent | 18a14f4dac9dbf517fbe8158b740147a06083cc4 (diff) | |
download | gnunet-98edad8c6d481091fda3a59d1047762e10fe72c0.tar.gz gnunet-98edad8c6d481091fda3a59d1047762e10fe72c0.zip |
do not crash on multiple CNAMEs
Diffstat (limited to 'src')
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.c | 71 | ||||
-rw-r--r-- | src/util/resolver_api.c | 4 |
2 files changed, 47 insertions, 28 deletions
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c index 542085910..369bd3d63 100644 --- a/src/gns/gnunet-service-gns_resolver.c +++ b/src/gns/gnunet-service-gns_resolver.c | |||
@@ -946,35 +946,43 @@ dns_result_parser (void *cls, | |||
946 | if ( (p->num_answers > 0) && | 946 | if ( (p->num_answers > 0) && |
947 | (GNUNET_DNSPARSER_TYPE_CNAME == p->answers[0].type) && | 947 | (GNUNET_DNSPARSER_TYPE_CNAME == p->answers[0].type) && |
948 | (GNUNET_DNSPARSER_TYPE_CNAME != rh->record_type) ) | 948 | (GNUNET_DNSPARSER_TYPE_CNAME != rh->record_type) ) |
949 | { | 949 | { |
950 | int af; | 950 | int af; |
951 | 951 | ||
952 | GNUNET_free (rh->name); | 952 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, |
953 | rh->name = GNUNET_strdup (p->answers[0].data.hostname); | 953 | "Got CNAME `%s' from DNS for `%s'\n", |
954 | rh->name_resolution_pos = strlen (rh->name); | 954 | p->answers[0].data.hostname, |
955 | switch (rh->record_type) | 955 | rh->name); |
956 | { | 956 | if (NULL != rh->std_resolve) |
957 | case GNUNET_DNSPARSER_TYPE_A: | 957 | { |
958 | af = AF_INET; | 958 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
959 | break; | 959 | "Multiple CNAME results from DNS resolving `%s'! Not really allowed...\n", |
960 | case GNUNET_DNSPARSER_TYPE_AAAA: | ||
961 | af = AF_INET6; | ||
962 | break; | ||
963 | default: | ||
964 | af = AF_UNSPEC; | ||
965 | break; | ||
966 | } | ||
967 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
968 | "Doing standard DNS lookup for `%s'\n", | ||
969 | rh->name); | 960 | rh->name); |
970 | rh->std_resolve = GNUNET_RESOLVER_ip_get (rh->name, | 961 | GNUNET_RESOLVER_request_cancel (rh->std_resolve); |
971 | af, | 962 | } |
972 | DNS_LOOKUP_TIMEOUT, | 963 | GNUNET_free (rh->name); |
973 | &handle_dns_result, | 964 | rh->name = GNUNET_strdup (p->answers[0].data.hostname); |
974 | rh); | 965 | rh->name_resolution_pos = strlen (rh->name); |
975 | GNUNET_DNSPARSER_free_packet (p); | 966 | switch (rh->record_type) |
976 | return; | 967 | { |
968 | case GNUNET_DNSPARSER_TYPE_A: | ||
969 | af = AF_INET; | ||
970 | break; | ||
971 | case GNUNET_DNSPARSER_TYPE_AAAA: | ||
972 | af = AF_INET6; | ||
973 | break; | ||
974 | default: | ||
975 | af = AF_UNSPEC; | ||
976 | break; | ||
977 | } | 977 | } |
978 | rh->std_resolve = GNUNET_RESOLVER_ip_get (rh->name, | ||
979 | af, | ||
980 | DNS_LOOKUP_TIMEOUT, | ||
981 | &handle_dns_result, | ||
982 | rh); | ||
983 | GNUNET_DNSPARSER_free_packet (p); | ||
984 | return; | ||
985 | } | ||
978 | 986 | ||
979 | /* convert from (parsed) DNS to (binary) GNS format! */ | 987 | /* convert from (parsed) DNS to (binary) GNS format! */ |
980 | rd_count = p->num_answers + p->num_authority_records + p->num_additional_records; | 988 | rd_count = p->num_answers + p->num_authority_records + p->num_additional_records; |
@@ -1245,6 +1253,17 @@ handle_gns_cname_result (struct GNS_ResolverHandle *rh, | |||
1245 | rh); | 1253 | rh); |
1246 | return; | 1254 | return; |
1247 | } | 1255 | } |
1256 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
1257 | "Got CNAME `%s' from GNS for `%s'\n", | ||
1258 | cname, | ||
1259 | rh->name); | ||
1260 | if (NULL != rh->std_resolve) | ||
1261 | { | ||
1262 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | ||
1263 | "Multiple CNAME results from GNS resolving `%s'! Not really allowed...\n", | ||
1264 | rh->name); | ||
1265 | GNUNET_RESOLVER_request_cancel (rh->std_resolve); | ||
1266 | } | ||
1248 | /* name is absolute, go to DNS */ | 1267 | /* name is absolute, go to DNS */ |
1249 | GNUNET_free (rh->name); | 1268 | GNUNET_free (rh->name); |
1250 | rh->name = GNUNET_strdup (cname); | 1269 | rh->name = GNUNET_strdup (cname); |
diff --git a/src/util/resolver_api.c b/src/util/resolver_api.c index 68f02587a..21f902578 100644 --- a/src/util/resolver_api.c +++ b/src/util/resolver_api.c | |||
@@ -515,8 +515,8 @@ handle_response (void *cls, | |||
515 | if ( (NULL != rh->addr_callback) && | 515 | if ( (NULL != rh->addr_callback) && |
516 | (GNUNET_SYSERR != rh->was_transmitted) ) | 516 | (GNUNET_SYSERR != rh->was_transmitted) ) |
517 | rh->addr_callback (rh->cls, | 517 | rh->addr_callback (rh->cls, |
518 | NULL, | 518 | NULL, |
519 | 0); | 519 | 0); |
520 | } | 520 | } |
521 | rh->was_transmitted = GNUNET_NO; | 521 | rh->was_transmitted = GNUNET_NO; |
522 | GNUNET_RESOLVER_request_cancel (rh); | 522 | GNUNET_RESOLVER_request_cancel (rh); |