resolved: properly handle UDP ICMP errors as lost packets
UDP ICMP errors are reported to us via recvmsg() when we read a reply. Handle this properly, and consider this a lost packet, and retry the connection. This also adds some additional logging for invalid incoming packets.
This commit is contained in:
parent
a1a3f73a57
commit
7e1851e3c6
|
@ -779,15 +779,40 @@ static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *use
|
||||||
assert(t->scope);
|
assert(t->scope);
|
||||||
|
|
||||||
r = manager_recv(t->scope->manager, fd, DNS_PROTOCOL_DNS, &p);
|
r = manager_recv(t->scope->manager, fd, DNS_PROTOCOL_DNS, &p);
|
||||||
if (r <= 0)
|
if (ERRNO_IS_DISCONNECT(-r)) {
|
||||||
return r;
|
usec_t usec;
|
||||||
|
|
||||||
if (dns_packet_validate_reply(p) > 0 &&
|
/* UDP connection failure get reported via ICMP and then are possible delivered to us on the next
|
||||||
DNS_PACKET_ID(p) == t->id)
|
* recvmsg(). Treat this like a lost packet. */
|
||||||
dns_transaction_process_reply(t, p);
|
|
||||||
else
|
|
||||||
log_debug("Invalid DNS UDP packet, ignoring.");
|
|
||||||
|
|
||||||
|
log_debug_errno(r, "Connection failure for DNS UDP packet, treating as lost packet: %m");
|
||||||
|
assert_se(sd_event_now(t->scope->manager->event, clock_boottime_or_monotonic(), &usec) >= 0);
|
||||||
|
dns_server_packet_lost(t->server, t->current_features, usec - t->start_usec);
|
||||||
|
|
||||||
|
dns_transaction_retry(t);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (r < 0) {
|
||||||
|
dns_transaction_complete(t, DNS_TRANSACTION_RESOURCES);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
r = dns_packet_validate_reply(p);
|
||||||
|
if (r < 0) {
|
||||||
|
log_debug_errno(r, "Received invalid DNS packet as response, ignoring: %m");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (r == 0) {
|
||||||
|
log_debug("Received inappropriate DNS packet as response, ignoring: %m");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DNS_PACKET_ID(p) != t->id) {
|
||||||
|
log_debug("Received packet with incorrect transaction ID, ignoring: %m");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dns_transaction_process_reply(t, p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue