Skip to content

Commit 791dbff

Browse files
ldv-altkeszybz
authored andcommitted
resolved: fix use of ERRNO_IS_DISCONNECT()
Given that ERRNO_IS_DISCONNECT() also matches positive values, make sure this macro is not called with arguments that do not have errno semantics. In this case the argument passed to ERRNO_IS_DISCONNECT() is the value returned by manager_recv() which can legitimately return 1 without errno semantics, so fix this by moving ERRNO_IS_DISCONNECT() invocation to the branch where the return value is known to be negative. (cherry picked from commit 0bdea17)
1 parent 920568b commit 791dbff

File tree

1 file changed

+12
-15
lines changed

1 file changed

+12
-15
lines changed

src/resolve/resolved-dns-transaction.c

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,25 +1411,22 @@ static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *use
14111411
assert(t->scope);
14121412

14131413
r = manager_recv(t->scope->manager, fd, DNS_PROTOCOL_DNS, &p);
1414-
if (ERRNO_IS_DISCONNECT(r)) {
1415-
usec_t usec;
1416-
1417-
/* UDP connection failures get reported via ICMP and then are possibly delivered to us on the
1418-
* next recvmsg(). Treat this like a lost packet. */
1414+
if (r < 0) {
1415+
if (ERRNO_IS_DISCONNECT(r)) {
1416+
usec_t usec;
14191417

1420-
log_debug_errno(r, "Connection failure for DNS UDP packet: %m");
1421-
assert_se(sd_event_now(t->scope->manager->event, CLOCK_BOOTTIME, &usec) >= 0);
1422-
dns_server_packet_lost(t->server, IPPROTO_UDP, t->current_feature_level);
1418+
/* UDP connection failures get reported via ICMP and then are possibly delivered to us on the
1419+
* next recvmsg(). Treat this like a lost packet. */
14231420

1424-
dns_transaction_close_connection(t, /* use_graveyard = */ false);
1421+
log_debug_errno(r, "Connection failure for DNS UDP packet: %m");
1422+
assert_se(sd_event_now(t->scope->manager->event, CLOCK_BOOTTIME, &usec) >= 0);
1423+
dns_server_packet_lost(t->server, IPPROTO_UDP, t->current_feature_level);
14251424

1426-
if (dns_transaction_limited_retry(t)) /* Try a different server */
1427-
return 0;
1425+
dns_transaction_close_connection(t, /* use_graveyard = */ false);
14281426

1429-
dns_transaction_complete_errno(t, r);
1430-
return 0;
1431-
}
1432-
if (r < 0) {
1427+
if (dns_transaction_limited_retry(t)) /* Try a different server */
1428+
return 0;
1429+
}
14331430
dns_transaction_complete_errno(t, r);
14341431
return 0;
14351432
}

0 commit comments

Comments
 (0)