projects
/
project
/
mdnsd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
entry->service
[project/mdnsd.git]
/
dns.c
diff --git
a/dns.c
b/dns.c
index
1ff5d53
..
c5323e5
100644
(file)
--- a/
dns.c
+++ b/
dns.c
@@
-299,6
+299,9
@@
parse_answer(struct interface *iface, uint8_t *buffer, int len, uint8_t **b, int
return -1;
}
return -1;
}
+ if ((a->class & ~CLASS_FLUSH) != CLASS_IN)
+ return -1;
+
rdata = *b;
if (a->rdlength > *rlen) {
fprintf(stderr, "dropping: bad question\n");
rdata = *b;
if (a->rdlength > *rlen) {
fprintf(stderr, "dropping: bad question\n");
@@
-309,7
+312,7
@@
parse_answer(struct interface *iface, uint8_t *buffer, int len, uint8_t **b, int
*b += a->rdlength;
if (cache)
*b += a->rdlength;
if (cache)
- cache_answer(iface, buffer, len, name, a, rdata);
+ cache_answer(iface, buffer, len, name, a, rdata
, a->class & CLASS_FLUSH
);
return 0;
}
return 0;
}
@@
-331,7
+334,7
@@
parse_question(struct interface *iface, char *name, struct dns_question *q)
break;
case TYPE_PTR:
break;
case TYPE_PTR:
- service_announce_services(iface, name);
+ service_announce_services(iface, name
, announce_ttl
);
service_reply(iface, name, announce_ttl);
break;
service_reply(iface, name, announce_ttl);
break;
@@
-341,13
+344,13
@@
parse_question(struct interface *iface, char *name, struct dns_question *q)
if (host)
*host = '\0';
if (!strcmp(mdns_hostname, name))
if (host)
*host = '\0';
if (!strcmp(mdns_hostname, name))
- service_reply_a(iface,
q->type,
announce_ttl);
+ service_reply_a(iface, announce_ttl);
break;
};
}
void
break;
};
}
void
-dns_handle_packet(struct interface *iface,
uint8_t *buffer, int len, int unicast
)
+dns_handle_packet(struct interface *iface,
struct sockaddr *s, uint16_t port, uint8_t *buffer, int len
)
{
struct dns_header *h;
uint8_t *b = buffer;
{
struct dns_header *h;
uint8_t *b = buffer;
@@
-359,6
+362,10
@@
dns_handle_packet(struct interface *iface, uint8_t *buffer, int len, int unicast
return;
}
return;
}
+ if (h->questions && !iface->multicast && port != 5353)
+ // silently drop unicast questions that dont originate from port 5353
+ return;
+
while (h->questions-- > 0) {
char *name = dns_consume_name(buffer, len, &b, &rlen);
struct dns_question *q;
while (h->questions-- > 0) {
char *name = dns_consume_name(buffer, len, &b, &rlen);
struct dns_question *q;