aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/dns/dnsstub.c85
-rw-r--r--src/dns/gnunet-service-dns.c3
-rw-r--r--src/exit/gnunet-daemon-exit.c2
-rw-r--r--src/gns/gnunet-dns2gns.c23
-rw-r--r--src/gns/gnunet-service-gns_resolver.c27
-rw-r--r--src/include/gnunet_dns_service.h9
-rw-r--r--src/include/gnunet_dnsparser_lib.h1
7 files changed, 114 insertions, 36 deletions
diff --git a/src/dns/dnsstub.c b/src/dns/dnsstub.c
index 364b6fe28..c79502ce9 100644
--- a/src/dns/dnsstub.c
+++ b/src/dns/dnsstub.c
@@ -235,8 +235,22 @@ get_request_socket (struct GNUNET_DNSSTUB_Context *ctx,
235 struct GNUNET_DNSSTUB_RequestSocket *rs; 235 struct GNUNET_DNSSTUB_RequestSocket *rs;
236 struct GNUNET_NETWORK_FDSet *rset; 236 struct GNUNET_NETWORK_FDSet *rset;
237 237
238 rs = &ctx->sockets[GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE, 238 for (unsigned int i=0;i<256;i++)
239 DNS_SOCKET_MAX)]; 239 {
240 rs = &ctx->sockets[GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_NONCE,
241 DNS_SOCKET_MAX)];
242 if (NULL == rs->rc)
243 break;
244 }
245 if (NULL != rs->rc)
246 {
247 /* signal "failure" */
248 rs->rc (rs->rc_cls,
249 rs,
250 NULL,
251 0);
252 rs->rc = NULL;
253 }
240 rs->timeout = GNUNET_TIME_relative_to_absolute (REQUEST_TIMEOUT); 254 rs->timeout = GNUNET_TIME_relative_to_absolute (REQUEST_TIMEOUT);
241 switch (af) 255 switch (af)
242 { 256 {
@@ -271,9 +285,11 @@ get_request_socket (struct GNUNET_DNSSTUB_Context *ctx,
271 return NULL; 285 return NULL;
272 rset = GNUNET_NETWORK_fdset_create (); 286 rset = GNUNET_NETWORK_fdset_create ();
273 if (NULL != rs->dnsout4) 287 if (NULL != rs->dnsout4)
274 GNUNET_NETWORK_fdset_set (rset, rs->dnsout4); 288 GNUNET_NETWORK_fdset_set (rset,
289 rs->dnsout4);
275 if (NULL != rs->dnsout6) 290 if (NULL != rs->dnsout6)
276 GNUNET_NETWORK_fdset_set (rset, rs->dnsout6); 291 GNUNET_NETWORK_fdset_set (rset,
292 rs->dnsout6);
277 rs->read_task = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, 293 rs->read_task = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
278 REQUEST_TIMEOUT, 294 REQUEST_TIMEOUT,
279 rset, 295 rset,
@@ -326,11 +342,11 @@ transmit_query (void *cls)
326 * 342 *
327 * @param ctx stub resolver to use 343 * @param ctx stub resolver to use
328 * @param sa the socket address 344 * @param sa the socket address
329 * @param sa_len the socket length 345 * @param sa_len the length of @a sa
330 * @param request DNS request to transmit 346 * @param request DNS request to transmit
331 * @param request_len number of bytes in msg 347 * @param request_len number of bytes in @a request
332 * @param rc function to call with result 348 * @param rc function to call with result
333 * @param rc_cls closure for 'rc' 349 * @param rc_cls closure for @a rc
334 * @return socket used for the request, NULL on error 350 * @return socket used for the request, NULL on error
335 */ 351 */
336struct GNUNET_DNSSTUB_RequestSocket * 352struct GNUNET_DNSSTUB_RequestSocket *
@@ -347,6 +363,7 @@ GNUNET_DNSSTUB_resolve (struct GNUNET_DNSSTUB_Context *ctx,
347 if (NULL == (rs = get_request_socket (ctx, 363 if (NULL == (rs = get_request_socket (ctx,
348 sa->sa_family))) 364 sa->sa_family)))
349 return NULL; 365 return NULL;
366 GNUNET_assert (NULL == rs->rc);
350 GNUNET_memcpy (&rs->addr, 367 GNUNET_memcpy (&rs->addr,
351 sa, 368 sa,
352 sa_len); 369 sa_len);
@@ -389,7 +406,9 @@ GNUNET_DNSSTUB_resolve2 (struct GNUNET_DNSSTUB_Context *ctx,
389 406
390 memset (&v4, 0, sizeof (v4)); 407 memset (&v4, 0, sizeof (v4));
391 memset (&v6, 0, sizeof (v6)); 408 memset (&v6, 0, sizeof (v6));
392 if (1 == inet_pton (AF_INET, ctx->dns_exit, &v4.sin_addr)) 409 if (1 == inet_pton (AF_INET,
410 ctx->dns_exit,
411 &v4.sin_addr))
393 { 412 {
394 salen = sizeof (v4); 413 salen = sizeof (v4);
395 v4.sin_family = AF_INET; 414 v4.sin_family = AF_INET;
@@ -400,7 +419,9 @@ GNUNET_DNSSTUB_resolve2 (struct GNUNET_DNSSTUB_Context *ctx,
400 sa = (struct sockaddr *) &v4; 419 sa = (struct sockaddr *) &v4;
401 af = AF_INET; 420 af = AF_INET;
402 } 421 }
403 else if (1 == inet_pton (AF_INET6, ctx->dns_exit, &v6.sin6_addr)) 422 else if (1 == inet_pton (AF_INET6,
423 ctx->dns_exit,
424 &v6.sin6_addr))
404 { 425 {
405 salen = sizeof (v6); 426 salen = sizeof (v6);
406 v6.sin6_family = AF_INET6; 427 v6.sin6_family = AF_INET6;
@@ -416,8 +437,10 @@ GNUNET_DNSSTUB_resolve2 (struct GNUNET_DNSSTUB_Context *ctx,
416 GNUNET_break (0); 437 GNUNET_break (0);
417 return NULL; 438 return NULL;
418 } 439 }
419 if (NULL == (rs = get_request_socket (ctx, af))) 440 if (NULL == (rs = get_request_socket (ctx,
441 af)))
420 return NULL; 442 return NULL;
443 GNUNET_assert (NULL == rs->rc);
421 if (NULL != rs->dnsout4) 444 if (NULL != rs->dnsout4)
422 dnsout = rs->dnsout4; 445 dnsout = rs->dnsout4;
423 else 446 else
@@ -430,15 +453,17 @@ GNUNET_DNSSTUB_resolve2 (struct GNUNET_DNSSTUB_Context *ctx,
430 return NULL; 453 return NULL;
431 } 454 }
432 GNUNET_memcpy (&rs->addr, 455 GNUNET_memcpy (&rs->addr,
433 sa, 456 sa,
434 salen); 457 salen);
435 rs->addrlen = salen; 458 rs->addrlen = salen;
436 rs->rc = rc; 459 rs->rc = rc;
437 rs->rc_cls = rc_cls; 460 rs->rc_cls = rc_cls;
438 if (GNUNET_SYSERR == 461 if (GNUNET_SYSERR ==
439 GNUNET_NETWORK_socket_sendto (dnsout, 462 GNUNET_NETWORK_socket_sendto (dnsout,
440 request, 463 request,
441 request_len, sa, salen)) 464 request_len,
465 sa,
466 salen))
442 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 467 GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
443 _("Failed to send DNS request to %s\n"), 468 _("Failed to send DNS request to %s\n"),
444 GNUNET_a2s (sa, salen)); 469 GNUNET_a2s (sa, salen));
@@ -466,7 +491,9 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs,
466 int len; 491 int len;
467 492
468#ifndef MINGW 493#ifndef MINGW
469 if (0 != ioctl (GNUNET_NETWORK_get_fd (dnsout), FIONREAD, &len)) 494 if (0 != ioctl (GNUNET_NETWORK_get_fd (dnsout),
495 FIONREAD,
496 &len))
470 { 497 {
471 /* conservative choice: */ 498 /* conservative choice: */
472 len = UINT16_MAX; 499 len = UINT16_MAX;
@@ -484,11 +511,14 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs,
484 addrlen = sizeof (addr); 511 addrlen = sizeof (addr);
485 memset (&addr, 0, sizeof (addr)); 512 memset (&addr, 0, sizeof (addr));
486 r = GNUNET_NETWORK_socket_recvfrom (dnsout, 513 r = GNUNET_NETWORK_socket_recvfrom (dnsout,
487 buf, sizeof (buf), 514 buf,
488 (struct sockaddr*) &addr, &addrlen); 515 sizeof (buf),
516 (struct sockaddr*) &addr,
517 &addrlen);
489 if (-1 == r) 518 if (-1 == r)
490 { 519 {
491 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "recvfrom"); 520 GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
521 "recvfrom");
492 GNUNET_NETWORK_socket_close (dnsout); 522 GNUNET_NETWORK_socket_close (dnsout);
493 return GNUNET_SYSERR; 523 return GNUNET_SYSERR;
494 } 524 }
@@ -543,25 +573,32 @@ read_response (void *cls)
543 } 573 }
544 /* read and process ready sockets */ 574 /* read and process ready sockets */
545 if ((NULL != rs->dnsout4) && 575 if ((NULL != rs->dnsout4) &&
546 (GNUNET_NETWORK_fdset_isset (tc->read_ready, rs->dnsout4)) && 576 (GNUNET_NETWORK_fdset_isset (tc->read_ready,
547 (GNUNET_SYSERR == do_dns_read (rs, rs->dnsout4))) 577 rs->dnsout4)) &&
578 (GNUNET_SYSERR == do_dns_read (rs,
579 rs->dnsout4)))
548 rs->dnsout4 = NULL; 580 rs->dnsout4 = NULL;
549 if ((NULL != rs->dnsout6) && 581 if ((NULL != rs->dnsout6) &&
550 (GNUNET_NETWORK_fdset_isset (tc->read_ready, rs->dnsout6)) && 582 (GNUNET_NETWORK_fdset_isset (tc->read_ready,
551 (GNUNET_SYSERR == do_dns_read (rs, rs->dnsout6))) 583 rs->dnsout6)) &&
584 (GNUNET_SYSERR == do_dns_read (rs,
585 rs->dnsout6)))
552 rs->dnsout6 = NULL; 586 rs->dnsout6 = NULL;
553 587
554 /* re-schedule read task */ 588 /* re-schedule read task */
555 rset = GNUNET_NETWORK_fdset_create (); 589 rset = GNUNET_NETWORK_fdset_create ();
556 if (NULL != rs->dnsout4) 590 if (NULL != rs->dnsout4)
557 GNUNET_NETWORK_fdset_set (rset, rs->dnsout4); 591 GNUNET_NETWORK_fdset_set (rset,
592 rs->dnsout4);
558 if (NULL != rs->dnsout6) 593 if (NULL != rs->dnsout6)
559 GNUNET_NETWORK_fdset_set (rset, rs->dnsout6); 594 GNUNET_NETWORK_fdset_set (rset,
595 rs->dnsout6);
560 rs->read_task = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT, 596 rs->read_task = GNUNET_SCHEDULER_add_select (GNUNET_SCHEDULER_PRIORITY_DEFAULT,
561 GNUNET_TIME_absolute_get_remaining (rs->timeout), 597 GNUNET_TIME_absolute_get_remaining (rs->timeout),
562 rset, 598 rset,
563 NULL, 599 NULL,
564 &read_response, rs); 600 &read_response,
601 rs);
565 GNUNET_NETWORK_fdset_destroy (rset); 602 GNUNET_NETWORK_fdset_destroy (rset);
566} 603}
567 604
diff --git a/src/dns/gnunet-service-dns.c b/src/dns/gnunet-service-dns.c
index ffc94afb7..9feaa8413 100644
--- a/src/dns/gnunet-service-dns.c
+++ b/src/dns/gnunet-service-dns.c
@@ -729,6 +729,9 @@ process_dns_result (void *cls,
729 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 729 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
730 "Processing DNS result from stub resolver\n"); 730 "Processing DNS result from stub resolver\n");
731 GNUNET_assert (NULL == cls); 731 GNUNET_assert (NULL == cls);
732 if (NULL == dns)
733 return; /* ignore */
734
732 rr = &requests[dns->id]; 735 rr = &requests[dns->id];
733 if ( (rr->phase != RP_INTERNET_DNS) || 736 if ( (rr->phase != RP_INTERNET_DNS) ||
734 (rr->rs != rs) ) 737 (rr->rs != rs) )
diff --git a/src/exit/gnunet-daemon-exit.c b/src/exit/gnunet-daemon-exit.c
index c624e083e..0b3cc505a 100644
--- a/src/exit/gnunet-daemon-exit.c
+++ b/src/exit/gnunet-daemon-exit.c
@@ -475,6 +475,8 @@ process_dns_result (void *cls,
475 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 475 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
476 "Processing DNS result from stub resolver\n"); 476 "Processing DNS result from stub resolver\n");
477 GNUNET_assert (NULL == cls); 477 GNUNET_assert (NULL == cls);
478 if (NULL == dns)
479 return;
478 /* Handle case that this is a reply to a request from a CADET DNS channel */ 480 /* Handle case that this is a reply to a request from a CADET DNS channel */
479 ts = channels[dns->id]; 481 ts = channels[dns->id];
480 if ( (NULL == ts) || 482 if ( (NULL == ts) ||
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,
diff --git a/src/include/gnunet_dns_service.h b/src/include/gnunet_dns_service.h
index 76b708dcf..017d5a039 100644
--- a/src/include/gnunet_dns_service.h
+++ b/src/include/gnunet_dns_service.h
@@ -122,10 +122,11 @@ enum GNUNET_DNS_Flags
122 * @param request_length number of bytes in request 122 * @param request_length number of bytes in request
123 * @param request udp payload of the DNS request 123 * @param request udp payload of the DNS request
124 */ 124 */
125typedef void (*GNUNET_DNS_RequestHandler)(void *cls, 125typedef void
126 struct GNUNET_DNS_RequestHandle *rh, 126(*GNUNET_DNS_RequestHandler)(void *cls,
127 size_t request_length, 127 struct GNUNET_DNS_RequestHandle *rh,
128 const char *request); 128 size_t request_length,
129 const char *request);
129 130
130 131
131/** 132/**
diff --git a/src/include/gnunet_dnsparser_lib.h b/src/include/gnunet_dnsparser_lib.h
index 9fe3491d6..80a67c3c7 100644
--- a/src/include/gnunet_dnsparser_lib.h
+++ b/src/include/gnunet_dnsparser_lib.h
@@ -49,6 +49,7 @@
49/** 49/**
50 * A few common DNS types. 50 * A few common DNS types.
51 */ 51 */
52#define GNUNET_DNSPARSER_TYPE_ANY 0
52#define GNUNET_DNSPARSER_TYPE_A 1 53#define GNUNET_DNSPARSER_TYPE_A 1
53#define GNUNET_DNSPARSER_TYPE_NS 2 54#define GNUNET_DNSPARSER_TYPE_NS 2
54#define GNUNET_DNSPARSER_TYPE_CNAME 5 55#define GNUNET_DNSPARSER_TYPE_CNAME 5