projects
/
oweals
/
mdnsd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix advertised IPv6 addresses
[oweals/mdnsd.git]
/
dns.c
diff --git
a/dns.c
b/dns.c
index aadfdd8f6927806cbdb7108d81c1031559100308..3e902d019df417fd5443d436c956992cf99fdc5a 100644
(file)
--- a/
dns.c
+++ b/
dns.c
@@
-200,10
+200,8
@@
dns_reply_a(struct interface *iface, struct sockaddr *to, int ttl)
dns_add_answer(TYPE_A, (uint8_t *) &sa->sin_addr, 4, ttl);
}
if (ifa->ifa_addr->sa_family == AF_INET6) {
dns_add_answer(TYPE_A, (uint8_t *) &sa->sin_addr, 4, ttl);
}
if (ifa->ifa_addr->sa_family == AF_INET6) {
- uint8_t ll_prefix[] = {0xfe, 0x80 };
sa6 = (struct sockaddr_in6 *) ifa->ifa_addr;
sa6 = (struct sockaddr_in6 *) ifa->ifa_addr;
- if (!memcmp(&sa6->sin6_addr, &ll_prefix, 2))
- dns_add_answer(TYPE_AAAA, (uint8_t *) &sa6->sin6_addr, 16, ttl);
+ dns_add_answer(TYPE_AAAA, (uint8_t *) &sa6->sin6_addr, 16, ttl);
}
}
dns_send_answer(iface, to, mdns_hostname_local);
}
}
dns_send_answer(iface, to, mdns_hostname_local);
@@
-222,6
+220,7
@@
scan_name(const uint8_t *buffer, int len)
if (IS_COMPRESSED(l))
return offset + 2;
if (IS_COMPRESSED(l))
return offset + 2;
+ if (l + 1 > len) return -1;
len -= l + 1;
offset += l + 1;
buffer += l + 1;
len -= l + 1;
offset += l + 1;
buffer += l + 1;
@@
-237,16
+236,16
@@
static struct dns_header*
dns_consume_header(uint8_t **data, int *len)
{
struct dns_header *h = (struct dns_header *) *data;
dns_consume_header(uint8_t **data, int *len)
{
struct dns_header *h = (struct dns_header *) *data;
- uint16_t *swap = (uint16_t *) h;
- int endianess = 6;
if (*len < sizeof(struct dns_header))
return NULL;
if (*len < sizeof(struct dns_header))
return NULL;
- while (endianess--) {
- *swap = be16_to_cpu(*swap);
- swap++;
- }
+ h->id = be16_to_cpu(h->id);
+ h->flags = be16_to_cpu(h->flags);
+ h->questions = be16_to_cpu(h->questions);
+ h->answers = be16_to_cpu(h->answers);
+ h->authority = be16_to_cpu(h->authority);
+ h->additional = be16_to_cpu(h->additional);
*len -= sizeof(struct dns_header);
*data += sizeof(struct dns_header);
*len -= sizeof(struct dns_header);
*data += sizeof(struct dns_header);
@@
-258,16
+257,12
@@
static struct dns_question*
dns_consume_question(uint8_t **data, int *len)
{
struct dns_question *q = (struct dns_question *) *data;
dns_consume_question(uint8_t **data, int *len)
{
struct dns_question *q = (struct dns_question *) *data;
- uint16_t *swap = (uint16_t *) q;
- int endianess = 2;
if (*len < sizeof(struct dns_question))
return NULL;
if (*len < sizeof(struct dns_question))
return NULL;
- while (endianess--) {
- *swap = be16_to_cpu(*swap);
- swap++;
- }
+ q->type = be16_to_cpu(q->type);
+ q->class = be16_to_cpu(q->class);
*len -= sizeof(struct dns_question);
*data += sizeof(struct dns_question);
*len -= sizeof(struct dns_question);
*data += sizeof(struct dns_question);
@@
-321,7
+316,7
@@
static int parse_answer(struct interface *iface, struct sockaddr *from,
struct dns_answer *a;
uint8_t *rdata;
struct dns_answer *a;
uint8_t *rdata;
- if (!name) {
+ if (!name
|| *rlen < 0
) {
fprintf(stderr, "dropping: bad question\n");
return -1;
}
fprintf(stderr, "dropping: bad question\n");
return -1;
}
@@
-425,7
+420,7
@@
dns_handle_packet(struct interface *iface, struct sockaddr *from, uint16_t port,
char *name = dns_consume_name(buffer, len, &b, &rlen);
struct dns_question *q;
char *name = dns_consume_name(buffer, len, &b, &rlen);
struct dns_question *q;
- if (!name) {
+ if (!name
|| rlen < 0
) {
fprintf(stderr, "dropping: bad name\n");
return;
}
fprintf(stderr, "dropping: bad name\n");
return;
}