aboutsummaryrefslogtreecommitdiff
path: root/src/vpn
diff options
context:
space:
mode:
authorPhilipp Tölke <toelke@in.tum.de>2011-10-26 10:29:09 +0000
committerPhilipp Tölke <toelke@in.tum.de>2011-10-26 10:29:09 +0000
commitcc6252c35c904a6aadee2a6351e506211bfafe01 (patch)
tree37b3494dd0d0b0cf130c5a3cefb981d16f17953e /src/vpn
parent1505339f12dd56f7cdcc3237cd88869b0b8c7ed3 (diff)
downloadgnunet-cc6252c35c904a6aadee2a6351e506211bfafe01.tar.gz
gnunet-cc6252c35c904a6aadee2a6351e506211bfafe01.zip
handle !A and !AAAA better
Diffstat (limited to 'src/vpn')
-rw-r--r--src/vpn/gnunet-service-dns.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/vpn/gnunet-service-dns.c b/src/vpn/gnunet-service-dns.c
index 3c38b2086..0ce45ab48 100644
--- a/src/vpn/gnunet-service-dns.c
+++ b/src/vpn/gnunet-service-dns.c
@@ -481,11 +481,26 @@ receive_mesh_answer (void *cls
481 return GNUNET_OK; 481 return GNUNET_OK;
482 } 482 }
483 483
484 answer->pkt.addrsize = ntohs (pdns->answers[0]->data_len); 484 int i = 0;
485
486 while (i < ntohs(pdns->s.ancount) &&
487 (pdns->answers[i]->type != 28 ||
488 pdns->answers[i]->type != 1))
489 i++;
490
491 if (i >= ntohs (pdns->s.ancount))
492 {
493 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Answer does not contain any usable answers.\n");
494 free_parsed_dns_packet (pdns);
495 GNUNET_free (answer);
496 return GNUNET_OK;
497 }
498
499 answer->pkt.addrsize = ntohs (pdns->answers[i]->data_len);
485 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "The first answer has the addrlen %d\n", 500 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "The first answer has the addrlen %d\n",
486 answer->pkt.addrsize); 501 answer->pkt.addrsize);
487 memcpy (answer->pkt.addr, pdns->answers[0]->data, 502 memcpy (answer->pkt.addr, pdns->answers[i]->data,
488 ntohs (pdns->answers[0]->data_len)); 503 ntohs (pdns->answers[i]->data_len));
489 504
490 memcpy(answer->pkt.from, query_states[dns->s.id].remote_ip, query_states[dns->s.id].addrlen); 505 memcpy(answer->pkt.from, query_states[dns->s.id].remote_ip, query_states[dns->s.id].addrlen);
491 memcpy(answer->pkt.to, query_states[dns->s.id].local_ip, query_states[dns->s.id].addrlen); 506 memcpy(answer->pkt.to, query_states[dns->s.id].local_ip, query_states[dns->s.id].addrlen);
@@ -521,13 +536,18 @@ receive_mesh_answer (void *cls
521 drec_data->type = htons (28); /* AAAA */ 536 drec_data->type = htons (28); /* AAAA */
522 drec_data->data_len = htons (16); 537 drec_data->data_len = htons (16);
523 } 538 }
524 else 539 else if (4 == answer->pkt.addrsize)
525 { 540 {
526 answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_REMOTE_A; 541 answer->pkt.subtype = GNUNET_DNS_ANSWER_TYPE_REMOTE_A;
527 dque->type = htons (1); /* A */ 542 dque->type = htons (1); /* A */
528 drec_data->type = htons (1); /* A */ 543 drec_data->type = htons (1); /* A */
529 drec_data->data_len = htons (4); 544 drec_data->data_len = htons (4);
530 } 545 }
546 else
547 {
548 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "dns-answer with data_len = %d\n", answer->pkt.addrsize);
549 GNUNET_break(0);
550 }
531 dque->class = htons (1); /* IN */ 551 dque->class = htons (1); /* IN */
532 552
533 char *anname = 553 char *anname =
@@ -536,7 +556,7 @@ receive_mesh_answer (void *cls
536 memcpy (anname, "\xc0\x0c", 2); 556 memcpy (anname, "\xc0\x0c", 2);
537 drec_data->class = htons (1); /* IN */ 557 drec_data->class = htons (1); /* IN */
538 558
539 drec_data->ttl = pdns->answers[0]->ttl; 559 drec_data->ttl = pdns->answers[i]->ttl;
540 560
541 /* Calculate at which offset in the packet the IPv6-Address belongs, it is 561 /* Calculate at which offset in the packet the IPv6-Address belongs, it is
542 * filled in by the daemon-vpn */ 562 * filled in by the daemon-vpn */