diff options
Diffstat (limited to 'src/util/dnsstub.c')
-rw-r--r-- | src/util/dnsstub.c | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/src/util/dnsstub.c b/src/util/dnsstub.c index 1ac274c92..c2f2a441f 100644 --- a/src/util/dnsstub.c +++ b/src/util/dnsstub.c | |||
@@ -324,24 +324,50 @@ do_dns_read (struct GNUNET_DNSSTUB_RequestSocket *rs, | |||
324 | found = GNUNET_NO; | 324 | found = GNUNET_NO; |
325 | for (struct DnsServer *ds = ctx->dns_head; NULL != ds; ds = ds->next) | 325 | for (struct DnsServer *ds = ctx->dns_head; NULL != ds; ds = ds->next) |
326 | { | 326 | { |
327 | if (0 == memcmp (&addr, | 327 | if (ds->ss.ss_family != addr.ss_family) |
328 | &ds->ss, | 328 | continue; |
329 | GNUNET_MIN (sizeof(struct sockaddr_storage), addrlen))) | 329 | if (addr.ss_family == AF_INET) |
330 | { | 330 | { |
331 | found = GNUNET_YES; | 331 | struct sockaddr_in *v4 = (struct sockaddr_in *) &addr; |
332 | break; | 332 | struct sockaddr_in *ds_v4 = (struct sockaddr_in *) &ds->ss; |
333 | |||
334 | |||
335 | if ((0 == memcmp (&v4->sin_addr, | ||
336 | &ds_v4->sin_addr, | ||
337 | sizeof(struct sockaddr_in))) && | ||
338 | (v4->sin_port == ds_v4->sin_port)) | ||
339 | { | ||
340 | found = GNUNET_YES; | ||
341 | break; | ||
342 | } | ||
343 | } | ||
344 | else | ||
345 | { | ||
346 | struct sockaddr_in6 *v6 = (struct sockaddr_in6 *) &addr; | ||
347 | struct sockaddr_in6 *ds_v6 = (struct sockaddr_in6 *) &ds->ss; | ||
348 | |||
349 | if (0 == memcmp (&v6->sin6_addr, | ||
350 | &ds_v6->sin6_addr, | ||
351 | sizeof (v6->sin6_addr)) && | ||
352 | (v6->sin6_port == ds_v6->sin6_port)) | ||
353 | { | ||
354 | found = GNUNET_YES; | ||
355 | break; | ||
356 | } | ||
357 | |||
333 | } | 358 | } |
334 | } | 359 | } |
335 | if (GNUNET_NO == found) | 360 | if (GNUNET_NO == found) |
336 | { | 361 | { |
337 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 362 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
338 | "Received DNS response from server we never asked (ignored)"); | 363 | "Received DNS response from server we never asked (ignored)\n"); |
364 | |||
339 | return GNUNET_NO; | 365 | return GNUNET_NO; |
340 | } | 366 | } |
341 | if (sizeof(struct GNUNET_TUN_DnsHeader) > (size_t) r) | 367 | if (sizeof(struct GNUNET_TUN_DnsHeader) > (size_t) r) |
342 | { | 368 | { |
343 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 369 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
344 | _ ("Received DNS response that is too small (%u bytes)"), | 370 | _ ("Received DNS response that is too small (%u bytes)\n"), |
345 | (unsigned int) r); | 371 | (unsigned int) r); |
346 | return GNUNET_NO; | 372 | return GNUNET_NO; |
347 | } | 373 | } |
@@ -648,7 +674,7 @@ GNUNET_DNSSTUB_add_dns_sa (struct GNUNET_DNSSTUB_Context *ctx, | |||
648 | ds = GNUNET_new (struct DnsServer); | 674 | ds = GNUNET_new (struct DnsServer); |
649 | switch (sa->sa_family) | 675 | switch (sa->sa_family) |
650 | { | 676 | { |
651 | case AF_INET: | 677 | case AF_INET : |
652 | GNUNET_memcpy (&ds->ss, sa, sizeof(struct sockaddr_in)); | 678 | GNUNET_memcpy (&ds->ss, sa, sizeof(struct sockaddr_in)); |
653 | break; | 679 | break; |
654 | 680 | ||