Merge pull request #11993 from poettering/resolved-stub-edns-size

some resolved stub dns reply fixes
This commit is contained in:
Zbigniew Jędrzejewski-Szmek 2019-03-14 11:10:38 +01:00 committed by GitHub
commit 7b7426506a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 20 deletions

View file

@ -119,12 +119,12 @@ static inline uint16_t DNS_PACKET_PAYLOAD_SIZE_MAX(DnsPacket *p) {
/* Returns the advertised maximum size for replies, or the DNS default if there's nothing defined. */
if (p->ipproto == IPPROTO_TCP) /* we ignore EDNS(0) size data on TCP, like everybody else */
return DNS_PACKET_SIZE_MAX;
if (p->opt)
return MAX(DNS_PACKET_UNICAST_SIZE_MAX, p->opt->key->class);
if (p->ipproto == IPPROTO_TCP)
return DNS_PACKET_SIZE_MAX;
return DNS_PACKET_UNICAST_SIZE_MAX;
}

View file

@ -91,7 +91,14 @@ static int dns_stub_finish_reply_packet(
assert(p);
if (!add_opt) {
if (add_opt) {
r = dns_packet_append_opt(p, ADVERTISE_DATAGRAM_SIZE_MAX, edns0_do, rcode, NULL);
if (r == -EMSGSIZE) /* Hit the size limit? then indicate truncation */
tc = true;
else if (r < 0)
return r;
} else {
/* If the client can't to EDNS0, don't do DO either */
edns0_do = false;
@ -117,12 +124,6 @@ static int dns_stub_finish_reply_packet(
0 /* cd */,
rcode));
if (add_opt) {
r = dns_packet_append_opt(p, ADVERTISE_DATAGRAM_SIZE_MAX, edns0_do, rcode, NULL);
if (r < 0)
return r;
}
return 0;
}
@ -189,17 +190,19 @@ static void dns_stub_query_complete(DnsQuery *q) {
break;
}
r = dns_query_process_cname(q);
if (r == -ELOOP) {
(void) dns_stub_send_failure(q->manager, q->request_dns_stream, q->request_dns_packet, DNS_RCODE_SERVFAIL, false);
break;
if (!truncated) {
r = dns_query_process_cname(q);
if (r == -ELOOP) {
(void) dns_stub_send_failure(q->manager, q->request_dns_stream, q->request_dns_packet, DNS_RCODE_SERVFAIL, false);
break;
}
if (r < 0) {
log_debug_errno(r, "Failed to process CNAME: %m");
break;
}
if (r == DNS_QUERY_RESTARTED)
return;
}
if (r < 0) {
log_debug_errno(r, "Failed to process CNAME: %m");
break;
}
if (r == DNS_QUERY_RESTARTED)
return;
r = dns_stub_finish_reply_packet(
q->reply_dns_packet,