aboutsummaryrefslogtreecommitdiff
path: root/src/gns/gnunet-service-gns_resolver.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-04-05 16:25:46 +0200
committerChristian Grothoff <christian@grothoff.org>2018-04-05 16:25:46 +0200
commit32f590da99c8c77c063b58e3a105a3c05fa5e988 (patch)
treee40710b59eb8a89957841c810f0fb8fa9db1edda /src/gns/gnunet-service-gns_resolver.c
parenteea5388958b3c21336972a0c979dc344e3bc66e7 (diff)
downloadgnunet-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.c27
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,