aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
authorMartin Schanzenbach <schanzen@gnunet.org>2022-02-14 15:15:03 +0100
committerMartin Schanzenbach <schanzen@gnunet.org>2022-02-14 15:15:03 +0100
commit6866469e6dd066cecef416afda3f119a958db1a8 (patch)
treea5f0937966aa74b921c42ad1ffdf2737ee10ff26 /src/util
parent8f7f4944aaf9b689c4a5b35b869f17c18cd37f54 (diff)
downloadgnunet-6866469e6dd066cecef416afda3f119a958db1a8.tar.gz
gnunet-6866469e6dd066cecef416afda3f119a958db1a8.zip
UTIL: Fix DNS resolution
Diffstat (limited to 'src/util')
-rw-r--r--src/util/dnsstub.c45
1 files changed, 37 insertions, 8 deletions
diff --git a/src/util/dnsstub.c b/src/util/dnsstub.c
index 1ac274c92..dbdedec24 100644
--- a/src/util/dnsstub.c
+++ b/src/util/dnsstub.c
@@ -306,6 +306,7 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs,
306 int found; 306 int found;
307 struct sockaddr_storage addr; 307 struct sockaddr_storage addr;
308 socklen_t addrlen; 308 socklen_t addrlen;
309 socklen_t expectedlen;
309 struct GNUNET_TUN_DnsHeader *dns; 310 struct GNUNET_TUN_DnsHeader *dns;
310 311
311 addrlen = sizeof(addr); 312 addrlen = sizeof(addr);
@@ -324,24 +325,52 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs,
324 found = GNUNET_NO; 325 found = GNUNET_NO;
325 for (struct DnsServer *ds = ctx->dns_head; NULL != ds; ds = ds->next) 326 for (struct DnsServer *ds = ctx->dns_head; NULL != ds; ds = ds->next)
326 { 327 {
327 if (0 == memcmp (&addr, 328 if (ds->ss.ss_family != addr.ss_family)
328 &ds->ss, 329 continue;
329 GNUNET_MIN (sizeof(struct sockaddr_storage), addrlen))) 330 if (addr.ss_family == AF_INET)
330 { 331 {
331 found = GNUNET_YES; 332 struct sockaddr_in *v4 = (struct sockaddr_in *) &addr;
332 break; 333 struct sockaddr_in *ds_v4 = (struct sockaddr_in *) &ds->ss;
334
335
336 expectedlen = sizeof(struct sockaddr_in);
337 if ((0 == memcmp (&v4->sin_addr,
338 &ds_v4->sin_addr,
339 expectedlen)) &&
340 (v4->sin_port == ds_v4->sin_port))
341 {
342 found = GNUNET_YES;
343 break;
344 }
345 }
346 else
347 {
348 expectedlen = sizeof(struct sockaddr_in6);
349 struct sockaddr_in6 *v6 = (struct sockaddr_in6 *) &addr;
350 struct sockaddr_in6 *ds_v6 = (struct sockaddr_in6 *) &ds->ss;
351
352 if (0 == memcmp (&v6->sin6_addr,
353 &ds_v6->sin6_addr,
354 expectedlen) &&
355 (v6->sin6_port == ds_v6->sin6_port))
356 {
357 found = GNUNET_YES;
358 break;
359 }
360
333 } 361 }
334 } 362 }
335 if (GNUNET_NO == found) 363 if (GNUNET_NO == found)
336 { 364 {
337 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 365 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
338 "Received DNS response from server we never asked (ignored)"); 366 "Received DNS response from server we never asked (ignored)\n");
367
339 return GNUNET_NO; 368 return GNUNET_NO;
340 } 369 }
341 if (sizeof(struct GNUNET_TUN_DnsHeader) > (size_t) r) 370 if (sizeof(struct GNUNET_TUN_DnsHeader) > (size_t) r)
342 { 371 {
343 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 372 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
344 _ ("Received DNS response that is too small (%u bytes)"), 373 _ ("Received DNS response that is too small (%u bytes)\n"),
345 (unsigned int) r); 374 (unsigned int) r);
346 return GNUNET_NO; 375 return GNUNET_NO;
347 } 376 }
@@ -648,7 +677,7 @@ GNUNET_DNSSTUB_add_dns_sa (struct GNUNET_DNSSTUB_Context *ctx,
648 ds = GNUNET_new (struct DnsServer); 677 ds = GNUNET_new (struct DnsServer);
649 switch (sa->sa_family) 678 switch (sa->sa_family)
650 { 679 {
651 case AF_INET: 680 case AF_INET :
652 GNUNET_memcpy (&ds->ss, sa, sizeof(struct sockaddr_in)); 681 GNUNET_memcpy (&ds->ss, sa, sizeof(struct sockaddr_in));
653 break; 682 break;
654 683