diff options
author | Lennart Poettering <lennart@poettering.net> | 2023-10-31 23:00:41 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2023-11-01 23:00:45 +0100 |
commit | ae55c9c0aed1578efd981a9fe79135112e643575 (patch) | |
tree | 937c31f3e958479bc08b28277743a680452f62d9 | |
parent | NEWS: more typo fixes (diff) | |
download | systemd-ae55c9c0aed1578efd981a9fe79135112e643575.tar.xz systemd-ae55c9c0aed1578efd981a9fe79135112e643575.zip |
resolved: make sure "resolvectl monitor" can properly deal with stub queries
If we receive a query via the two stubs we store the original packet
instead of just the question object. Hence when we send monitor info to
subscribed clients we need to extract its question and also include it
in the returned data.
Fixes: #29580
-rw-r--r-- | src/resolve/resolved-dns-query.c | 2 | ||||
-rw-r--r-- | src/resolve/resolved-manager.c | 14 | ||||
-rw-r--r-- | src/resolve/resolved-manager.h | 2 |
3 files changed, 15 insertions, 3 deletions
diff --git a/src/resolve/resolved-dns-query.c b/src/resolve/resolved-dns-query.c index 58a7b2d878d..7eb6b9736e2 100644 --- a/src/resolve/resolved-dns-query.c +++ b/src/resolve/resolved-dns-query.c @@ -586,7 +586,7 @@ void dns_query_complete(DnsQuery *q, DnsTransactionState state) { q->state = state; - (void) manager_monitor_send(q->manager, q->state, q->answer_rcode, q->answer_errno, q->question_idna, q->question_utf8, q->collected_questions, q->answer); + (void) manager_monitor_send(q->manager, q->state, q->answer_rcode, q->answer_errno, q->question_idna, q->question_utf8, q->question_bypass, q->collected_questions, q->answer); dns_query_stop(q); if (q->complete) diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c index fd800cedfe0..fc8d7412fba 100644 --- a/src/resolve/resolved-manager.c +++ b/src/resolve/resolved-manager.c @@ -1105,6 +1105,7 @@ int manager_monitor_send( int error, DnsQuestion *question_idna, DnsQuestion *question_utf8, + DnsPacket *question_bypass, DnsQuestion *collected_questions, DnsAnswer *answer) { @@ -1119,11 +1120,22 @@ int manager_monitor_send( if (set_isempty(m->varlink_subscription)) return 0; - /* Merge both questions format into one */ + /* Merge all questions into one */ r = dns_question_merge(question_idna, question_utf8, &merged); if (r < 0) return log_error_errno(r, "Failed to merge UTF8/IDNA questions: %m"); + if (question_bypass) { + _cleanup_(dns_question_unrefp) DnsQuestion *merged2 = NULL; + + r = dns_question_merge(merged, question_bypass->question, &merged2); + if (r < 0) + return log_error_errno(r, "Failed to merge UTF8/IDNA questions and DNS packet question: %m"); + + dns_question_unref(merged); + merged = TAKE_PTR(merged2); + } + /* Convert the current primary question to JSON */ r = dns_question_to_json(merged, &jquestion); if (r < 0) diff --git a/src/resolve/resolved-manager.h b/src/resolve/resolved-manager.h index 16b883bd219..5cd5e834d39 100644 --- a/src/resolve/resolved-manager.h +++ b/src/resolve/resolved-manager.h @@ -176,7 +176,7 @@ int manager_start(Manager *m); uint32_t manager_find_mtu(Manager *m); -int manager_monitor_send(Manager *m, int state, int rcode, int error, DnsQuestion *question_idna, DnsQuestion *question_utf8, DnsQuestion *collected_questions, DnsAnswer *answer); +int manager_monitor_send(Manager *m, int state, int rcode, int error, DnsQuestion *question_idna, DnsQuestion *question_utf8, DnsPacket *question_bypass, DnsQuestion *collected_questions, DnsAnswer *answer); int manager_write(Manager *m, int fd, DnsPacket *p); int manager_send(Manager *m, int fd, int ifindex, int family, const union in_addr_union *destination, uint16_t port, const union in_addr_union *source, DnsPacket *p); |