aboutsummaryrefslogtreecommitdiff
path: root/src/gns
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-05-20 12:51:41 +0200
committerChristian Grothoff <christian@grothoff.org>2018-05-20 12:51:41 +0200
commit98edad8c6d481091fda3a59d1047762e10fe72c0 (patch)
treed5ad2187bbd0cbb3014688d8a48349cfb504d21e /src/gns
parent18a14f4dac9dbf517fbe8158b740147a06083cc4 (diff)
downloadgnunet-98edad8c6d481091fda3a59d1047762e10fe72c0.tar.gz
gnunet-98edad8c6d481091fda3a59d1047762e10fe72c0.zip
do not crash on multiple CNAMEs
Diffstat (limited to 'src/gns')
-rw-r--r--src/gns/gnunet-service-gns_resolver.c71
1 files changed, 45 insertions, 26 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);