diff options
author | Christian Grothoff <christian@grothoff.org> | 2018-04-05 16:25:46 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2018-04-05 16:25:46 +0200 |
commit | 32f590da99c8c77c063b58e3a105a3c05fa5e988 (patch) | |
tree | e40710b59eb8a89957841c810f0fb8fa9db1edda /src/gns/gnunet-service-gns_resolver.c | |
parent | eea5388958b3c21336972a0c979dc344e3bc66e7 (diff) | |
download | gnunet-32f590da99c8c77c063b58e3a105a3c05fa5e988.tar.gz gnunet-32f590da99c8c77c063b58e3a105a3c05fa5e988.zip |
where applicable, check DNS ID in responses before processing further
Diffstat (limited to 'src/gns/gnunet-service-gns_resolver.c')
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/gns/gnunet-service-gns_resolver.c b/src/gns/gnunet-service-gns_resolver.c index 0b86ca267..7fbe3a410 100644 --- a/src/gns/gnunet-service-gns_resolver.c +++ b/src/gns/gnunet-service-gns_resolver.c | |||
@@ -383,6 +383,11 @@ struct GNS_ResolverHandle | |||
383 | */ | 383 | */ |
384 | unsigned int loop_limiter; | 384 | unsigned int loop_limiter; |
385 | 385 | ||
386 | /** | ||
387 | * 16 bit random ID we used in the @e dns_request. | ||
388 | */ | ||
389 | uint16_t original_dns_id; | ||
390 | |||
386 | }; | 391 | }; |
387 | 392 | ||
388 | 393 | ||
@@ -843,17 +848,28 @@ dns_result_parser (void *cls, | |||
843 | unsigned int i; | 848 | unsigned int i; |
844 | 849 | ||
845 | (void) rs; | 850 | (void) rs; |
846 | rh->dns_request = NULL; | 851 | if (NULL == dns) |
847 | GNUNET_SCHEDULER_cancel (rh->task_id); | 852 | { |
848 | rh->task_id = NULL; | 853 | rh->dns_request = NULL; |
854 | GNUNET_SCHEDULER_cancel (rh->task_id); | ||
855 | rh->task_id = NULL; | ||
856 | rh->proc (rh->proc_cls, | ||
857 | 0, | ||
858 | NULL); | ||
859 | GNS_resolver_lookup_cancel (rh); | ||
860 | return; | ||
861 | } | ||
862 | if (rh->original_dns_id != dns->id) | ||
863 | { | ||
864 | /* DNS answer, but for another query */ | ||
865 | return; | ||
866 | } | ||
849 | p = GNUNET_DNSPARSER_parse ((const char *) dns, | 867 | p = GNUNET_DNSPARSER_parse ((const char *) dns, |
850 | dns_len); | 868 | dns_len); |
851 | if (NULL == p) | 869 | if (NULL == p) |
852 | { | 870 | { |
853 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 871 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
854 | _("Failed to parse DNS response\n")); | 872 | _("Failed to parse DNS response\n")); |
855 | rh->proc (rh->proc_cls, 0, NULL); | ||
856 | GNS_resolver_lookup_cancel (rh); | ||
857 | return; | 873 | return; |
858 | } | 874 | } |
859 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 875 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
@@ -1097,6 +1113,7 @@ recursive_dns_resolution (struct GNS_ResolverHandle *rh) | |||
1097 | } | 1113 | } |
1098 | else | 1114 | else |
1099 | { | 1115 | { |
1116 | rh->original_dns_id = p->id; | ||
1100 | rh->dns_request = GNUNET_DNSSTUB_resolve (dns_handle, | 1117 | rh->dns_request = GNUNET_DNSSTUB_resolve (dns_handle, |
1101 | (const struct sockaddr *) &ac->authority_info.dns_authority.dns_ip, | 1118 | (const struct sockaddr *) &ac->authority_info.dns_authority.dns_ip, |
1102 | sa_len, | 1119 | sa_len, |