resolved: make sure we initialize t->answer_errno before completing the transaction

We must have the error number around when completing the transaction.
Let's hence make sure we always initialize it *first* (we accidentally
did it once after).

Fixes: #11626
This commit is contained in:
Lennart Poettering 2020-08-28 22:44:57 +02:00
parent 5895a9d600
commit fd8a301703
1 changed files with 15 additions and 14 deletions

View File

@ -364,6 +364,14 @@ void dns_transaction_complete(DnsTransaction *t, DnsTransactionState state) {
dns_transaction_gc(t); dns_transaction_gc(t);
} }
static void dns_transaction_complete_errno(DnsTransaction *t, int error) {
assert(t);
assert(error != 0);
t->answer_errno = abs(error);
dns_transaction_complete(t, DNS_TRANSACTION_ERRNO);
}
static int dns_transaction_pick_server(DnsTransaction *t) { static int dns_transaction_pick_server(DnsTransaction *t) {
DnsServer *server; DnsServer *server;
@ -415,10 +423,8 @@ static void dns_transaction_retry(DnsTransaction *t, bool next_server) {
dns_scope_next_dns_server(t->scope); dns_scope_next_dns_server(t->scope);
r = dns_transaction_go(t); r = dns_transaction_go(t);
if (r < 0) { if (r < 0)
t->answer_errno = -r; dns_transaction_complete_errno(t, r);
dns_transaction_complete(t, DNS_TRANSACTION_ERRNO);
}
} }
static int dns_transaction_maybe_restart(DnsTransaction *t) { static int dns_transaction_maybe_restart(DnsTransaction *t) {
@ -466,10 +472,8 @@ static void on_transaction_stream_error(DnsTransaction *t, int error) {
dns_transaction_retry(t, true); dns_transaction_retry(t, true);
return; return;
} }
if (error != 0) { if (error != 0)
t->answer_errno = error; dns_transaction_complete_errno(t, error);
dns_transaction_complete(t, DNS_TRANSACTION_ERRNO);
}
} }
static int dns_transaction_on_stream_packet(DnsTransaction *t, DnsPacket *p) { static int dns_transaction_on_stream_packet(DnsTransaction *t, DnsPacket *p) {
@ -836,8 +840,7 @@ static void dns_transaction_process_dnssec(DnsTransaction *t) {
return; return;
fail: fail:
t->answer_errno = -r; dns_transaction_complete_errno(t, r);
dns_transaction_complete(t, DNS_TRANSACTION_ERRNO);
} }
static int dns_transaction_has_positive_answer(DnsTransaction *t, DnsAnswerFlags *flags) { static int dns_transaction_has_positive_answer(DnsTransaction *t, DnsAnswerFlags *flags) {
@ -1169,8 +1172,7 @@ void dns_transaction_process_reply(DnsTransaction *t, DnsPacket *p) {
return; return;
fail: fail:
t->answer_errno = -r; dns_transaction_complete_errno(t, r);
dns_transaction_complete(t, DNS_TRANSACTION_ERRNO);
} }
static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) { static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
@ -1196,8 +1198,7 @@ static int on_dns_packet(sd_event_source *s, int fd, uint32_t revents, void *use
return 0; return 0;
} }
if (r < 0) { if (r < 0) {
dns_transaction_complete(t, DNS_TRANSACTION_ERRNO); dns_transaction_complete_errno(t, r);
t->answer_errno = -r;
return 0; return 0;
} }
if (r == 0) if (r == 0)