aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2023-10-31 23:00:41 +0100
committerLennart Poettering <lennart@poettering.net>2023-11-01 23:00:45 +0100
commitae55c9c0aed1578efd981a9fe79135112e643575 (patch)
tree937c31f3e958479bc08b28277743a680452f62d9
parentNEWS: more typo fixes (diff)
downloadsystemd-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.c2
-rw-r--r--src/resolve/resolved-manager.c14
-rw-r--r--src/resolve/resolved-manager.h2
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);