diff options
author | Philipp Tölke <toelke@in.tum.de> | 2011-10-26 10:29:09 +0000 |
---|---|---|
committer | Philipp Tölke <toelke@in.tum.de> | 2011-10-26 10:29:09 +0000 |
commit | cc6252c35c904a6aadee2a6351e506211bfafe01 (patch) | |
tree | 37b3494dd0d0b0cf130c5a3cefb981d16f17953e /src/vpn | |
parent | 1505339f12dd56f7cdcc3237cd88869b0b8c7ed3 (diff) | |
download | gnunet-cc6252c35c904a6aadee2a6351e506211bfafe01.tar.gz gnunet-cc6252c35c904a6aadee2a6351e506211bfafe01.zip |
handle !A and !AAAA better
Diffstat (limited to 'src/vpn')
-rw-r--r-- | src/vpn/gnunet-service-dns.c | 30 |
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 */ |