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 | |
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')
-rw-r--r-- | src/gns/gnunet-dns2gns.c | 23 | ||||
-rw-r--r-- | src/gns/gnunet-service-gns_resolver.c | 27 |
2 files changed, 42 insertions, 8 deletions
diff --git a/src/gns/gnunet-dns2gns.c b/src/gns/gnunet-dns2gns.c index 3d16cd773..47cc6dde0 100644 --- a/src/gns/gnunet-dns2gns.c +++ b/src/gns/gnunet-dns2gns.c | |||
@@ -85,6 +85,11 @@ struct Request | |||
85 | * Number of bytes in @e udp_msg. | 85 | * Number of bytes in @e udp_msg. |
86 | */ | 86 | */ |
87 | size_t udp_msg_size; | 87 | size_t udp_msg_size; |
88 | |||
89 | /** | ||
90 | * ID of the original request. | ||
91 | */ | ||
92 | uint16_t original_request_id; | ||
88 | }; | 93 | }; |
89 | 94 | ||
90 | 95 | ||
@@ -255,6 +260,18 @@ dns_result_processor (void *cls, | |||
255 | struct Request *request = cls; | 260 | struct Request *request = cls; |
256 | 261 | ||
257 | (void) rs; | 262 | (void) rs; |
263 | if (NULL == dns) | ||
264 | { | ||
265 | /* DNSSTUB gave up, so we trigger timeout early */ | ||
266 | GNUNET_SCHEDULER_cancel (request->timeout_task); | ||
267 | do_timeout (request); | ||
268 | return; | ||
269 | } | ||
270 | if (request->original_request_id != dns->id) | ||
271 | { | ||
272 | /* for a another query, ignore */ | ||
273 | return; | ||
274 | } | ||
258 | request->packet = GNUNET_DNSPARSER_parse ((char*)dns, | 275 | request->packet = GNUNET_DNSPARSER_parse ((char*)dns, |
259 | r); | 276 | r); |
260 | send_response (request); | 277 | send_response (request); |
@@ -277,7 +294,6 @@ result_processor (void *cls, | |||
277 | { | 294 | { |
278 | struct Request *request = cls; | 295 | struct Request *request = cls; |
279 | struct GNUNET_DNSPARSER_Packet *packet; | 296 | struct GNUNET_DNSPARSER_Packet *packet; |
280 | uint32_t i; | ||
281 | struct GNUNET_DNSPARSER_Record rec; | 297 | struct GNUNET_DNSPARSER_Record rec; |
282 | 298 | ||
283 | request->lookup = NULL; | 299 | request->lookup = NULL; |
@@ -288,6 +304,7 @@ result_processor (void *cls, | |||
288 | "Using DNS resolver IP `%s' to resolve `%s'\n", | 304 | "Using DNS resolver IP `%s' to resolve `%s'\n", |
289 | dns_ip, | 305 | dns_ip, |
290 | request->packet->queries[0].name); | 306 | request->packet->queries[0].name); |
307 | request->original_request_id = request->packet->id; | ||
291 | GNUNET_DNSPARSER_free_packet (request->packet); | 308 | GNUNET_DNSPARSER_free_packet (request->packet); |
292 | request->packet = NULL; | 309 | request->packet = NULL; |
293 | request->dns_lookup = GNUNET_DNSSTUB_resolve2 (dns_stub, | 310 | request->dns_lookup = GNUNET_DNSSTUB_resolve2 (dns_stub, |
@@ -296,7 +313,7 @@ result_processor (void *cls, | |||
296 | &dns_result_processor, | 313 | &dns_result_processor, |
297 | request); | 314 | request); |
298 | return; | 315 | return; |
299 | } | 316 | } |
300 | packet = request->packet; | 317 | packet = request->packet; |
301 | packet->flags.query_or_response = 1; | 318 | packet->flags.query_or_response = 1; |
302 | packet->flags.return_code = GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR; | 319 | packet->flags.return_code = GNUNET_TUN_DNS_RETURN_CODE_NO_ERROR; |
@@ -307,7 +324,7 @@ result_processor (void *cls, | |||
307 | packet->flags.message_truncated = 0; | 324 | packet->flags.message_truncated = 0; |
308 | packet->flags.authoritative_answer = 0; | 325 | packet->flags.authoritative_answer = 0; |
309 | //packet->flags.opcode = GNUNET_TUN_DNS_OPCODE_STATUS; // ??? | 326 | //packet->flags.opcode = GNUNET_TUN_DNS_OPCODE_STATUS; // ??? |
310 | for (i=0;i<rd_count;i++) | 327 | for (uint32_t i=0;i<rd_count;i++) |
311 | { | 328 | { |
312 | // FIXME: do we need to hanlde #GNUNET_GNSRECORD_RF_SHADOW_RECORD | 329 | // FIXME: do we need to hanlde #GNUNET_GNSRECORD_RF_SHADOW_RECORD |
313 | // here? Or should we do this in libgnunetgns? | 330 | // here? Or should we do this in libgnunetgns? |
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, |