diff options
author | Martin Schanzenbach <schanzen@gnunet.org> | 2022-02-14 15:15:03 +0100 |
---|---|---|
committer | Martin Schanzenbach <schanzen@gnunet.org> | 2022-02-14 15:15:03 +0100 |
commit | 6866469e6dd066cecef416afda3f119a958db1a8 (patch) | |
tree | a5f0937966aa74b921c42ad1ffdf2737ee10ff26 | |
parent | 8f7f4944aaf9b689c4a5b35b869f17c18cd37f54 (diff) | |
download | gnunet-6866469e6dd066cecef416afda3f119a958db1a8.tar.gz gnunet-6866469e6dd066cecef416afda3f119a958db1a8.zip |
UTIL: Fix DNS resolution
-rw-r--r-- | src/util/dnsstub.c | 45 |
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 | ||