summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/resolve/resolved-bus.c9
-rw-r--r--src/resolve/resolved-dns-query.c9
-rw-r--r--src/resolve/resolved-dns-query.h1
-rw-r--r--src/resolve/resolved-varlink.c87
-rwxr-xr-xtest/units/testsuite-75.sh4
5 files changed, 51 insertions, 59 deletions
diff --git a/src/resolve/resolved-bus.c b/src/resolve/resolved-bus.c
index 908d5aeb31..51bb5b1ac7 100644
--- a/src/resolve/resolved-bus.c
+++ b/src/resolve/resolved-bus.c
@@ -515,9 +515,6 @@ static int bus_method_resolve_hostname(sd_bus_message *message, void *userdata,
q->bus_request = sd_bus_message_ref(message);
q->request_family = family;
- q->request_name = strdup(hostname);
- if (!q->request_name)
- return log_oom();
q->complete = bus_method_resolve_hostname_complete;
r = dns_query_bus_track(q, message);
@@ -838,9 +835,6 @@ static int bus_method_resolve_record(sd_bus_message *message, void *userdata, sd
q->bus_request = sd_bus_message_ref(message);
q->complete = bus_method_resolve_record_complete;
- q->request_name = strdup(name);
- if (!q->request_name)
- return log_oom();
r = dns_query_bus_track(q, message);
if (r < 0)
@@ -1198,9 +1192,6 @@ static int resolve_service_hostname(DnsQuery *q, DnsResourceRecord *rr, int ifin
return r;
aux->request_family = q->request_family;
- aux->request_name = strdup(rr->srv.name);
- if (!aux->request_name)
- return log_oom();
aux->complete = resolve_service_hostname_complete;
r = dns_query_make_auxiliary(aux, q);
diff --git a/src/resolve/resolved-dns-query.c b/src/resolve/resolved-dns-query.c
index 8daaacfc19..50c0e05ca6 100644
--- a/src/resolve/resolved-dns-query.c
+++ b/src/resolve/resolved-dns-query.c
@@ -427,7 +427,6 @@ DnsQuery *dns_query_free(DnsQuery *q) {
}
free(q->request_address_string);
- free(q->request_name);
if (q->manager) {
LIST_REMOVE(queries, q->manager->dns_queries, q);
@@ -586,12 +585,8 @@ void dns_query_complete(DnsQuery *q, DnsTransactionState state) {
q->state = state;
- if (state == DNS_TRANSACTION_SUCCESS && set_size(q->manager->varlink_subscription) > 0) {
- DnsQuestion *question = q->request_packet ? q->request_packet->question : NULL;
- const char *query_name = question ? dns_question_first_name(question) : q->request_name;
- if (query_name)
- (void) send_dns_notification(q->manager, q->answer, query_name);
- }
+ if (q->question_utf8 && state == DNS_TRANSACTION_SUCCESS && set_size(q->manager->varlink_subscription) > 0)
+ (void) send_dns_notification(q->manager, q->answer, dns_question_first_name(q->question_utf8));
dns_query_stop(q);
if (q->complete)
diff --git a/src/resolve/resolved-dns-query.h b/src/resolve/resolved-dns-query.h
index 0b00465008..43a833a08a 100644
--- a/src/resolve/resolved-dns-query.h
+++ b/src/resolve/resolved-dns-query.h
@@ -95,7 +95,6 @@ struct DnsQuery {
union in_addr_union request_address;
unsigned block_all_complete;
char *request_address_string;
- char *request_name;
/* DNS stub information */
DnsPacket *request_packet;
diff --git a/src/resolve/resolved-varlink.c b/src/resolve/resolved-varlink.c
index 67ae6ff441..259a4bb7c6 100644
--- a/src/resolve/resolved-varlink.c
+++ b/src/resolve/resolved-varlink.c
@@ -350,9 +350,6 @@ static int vl_method_resolve_hostname(Varlink *link, JsonVariant *parameters, Va
q->varlink_request = varlink_ref(link);
varlink_set_userdata(link, q);
q->request_family = p.family;
- q->request_name = strdup(p.name);
- if (!q->request_name)
- return log_oom();
q->complete = vl_method_resolve_hostname_complete;
r = dns_query_go(q);
@@ -540,8 +537,11 @@ static int vl_method_subscribe_dns_resolves(Varlink *link, JsonVariant *paramete
assert(link);
- m = varlink_server_get_userdata(varlink_get_server(link));
- assert(m);
+ m = ASSERT_PTR(varlink_server_get_userdata(varlink_get_server(link)));
+
+ /* if the client didn't set the more flag, return an empty response and close the connection */
+ if (!FLAGS_SET(flags, VARLINK_METHOD_MORE))
+ return varlink_error_errno(link, EINVAL);
if (json_variant_elements(parameters) > 0)
return varlink_error_invalid_parameter(link, parameters);
@@ -553,13 +553,48 @@ static int vl_method_subscribe_dns_resolves(Varlink *link, JsonVariant *paramete
log_debug("%u clients now attached for varlink notifications", set_size(m->varlink_subscription));
- /* if the client didn't set the more flag, return an empty response and close the connection */
- if (!FLAGS_SET(flags, VARLINK_METHOD_MORE))
- return varlink_reply(link, NULL);
-
return 1;
}
+static int varlink_notification_server_init(Manager *m) {
+ _cleanup_(varlink_server_unrefp) VarlinkServer *server = NULL;
+ int r;
+
+ assert(m);
+
+ if (!m->enable_varlink_notifications || m->varlink_notification_server)
+ return 0;
+
+ r = varlink_server_new(&server, VARLINK_SERVER_ROOT_ONLY);
+ if (r < 0)
+ return log_error_errno(r, "Failed to allocate varlink server object: %m");
+
+ varlink_server_set_userdata(server, m);
+
+ r = varlink_server_bind_method(
+ server,
+ "io.systemd.Resolve.Monitor.SubscribeQueryResults",
+ vl_method_subscribe_dns_resolves);
+ if (r < 0)
+ return log_error_errno(r, "Failed to register varlink methods: %m");
+
+ r = varlink_server_bind_disconnect(server, vl_on_notification_disconnect);
+ if (r < 0)
+ return log_error_errno(r, "Failed to register varlink disconnect handler: %m");
+
+ r = varlink_server_listen_address(server, "/run/systemd/resolve/io.systemd.Resolve.Monitor", 0660);
+ if (r < 0)
+ return log_error_errno(r, "Failed to bind to varlink socket: %m");
+
+ r = varlink_server_attach_event(server, m->event, SD_EVENT_PRIORITY_NORMAL);
+ if (r < 0)
+ return log_error_errno(r, "Failed to attach varlink connection to event loop: %m");
+
+ m->varlink_notification_server = TAKE_PTR(server);
+
+ return 0;
+}
+
int manager_varlink_init(Manager *m) {
_cleanup_(varlink_server_unrefp) VarlinkServer *s = NULL;
int r;
@@ -596,37 +631,9 @@ int manager_varlink_init(Manager *m) {
m->varlink_server = TAKE_PTR(s);
- if (m->enable_varlink_notifications) {
- if (m->varlink_notification_server)
- return 0;
-
- r = varlink_server_new(&s, VARLINK_SERVER_ACCOUNT_UID);
- if (r < 0)
- return log_error_errno(r, "Failed to allocate varlink server object: %m");
-
- varlink_server_set_userdata(s, m);
-
- r = varlink_server_bind_method_many(
- s,
- "io.systemd.Resolve.Monitor.SubscribeDnsResolves",
- vl_method_subscribe_dns_resolves);
- if (r < 0)
- return log_error_errno(r, "Failed to register varlink methods: %m");
-
- r = varlink_server_bind_disconnect(s, vl_on_notification_disconnect);
- if (r < 0)
- return log_error_errno(r, "Failed to register varlink disconnect handler: %m");
-
- r = varlink_server_listen_address(s, "/run/systemd/resolve/io.systemd.Resolve.Monitor", 0660);
- if (r < 0)
- return log_error_errno(r, "Failed to bind to varlink socket: %m");
-
- r = varlink_server_attach_event(s, m->event, SD_EVENT_PRIORITY_NORMAL);
- if (r < 0)
- return log_error_errno(r, "Failed to attach varlink connection to event loop: %m");
-
- m->varlink_notification_server = TAKE_PTR(s);
- }
+ r = varlink_notification_server_init(m);
+ if (r < 0)
+ return r;
return 0;
}
diff --git a/test/units/testsuite-75.sh b/test/units/testsuite-75.sh
index ba91284a73..7823f46583 100755
--- a/test/units/testsuite-75.sh
+++ b/test/units/testsuite-75.sh
@@ -102,7 +102,7 @@ cat >$NOTIFICATION_SUBSCRIPTION_SCRIPT <<EOF
#!/bin/sh
printf '
{
- "method": "io.systemd.Resolve.Monitor.SubscribeDnsResolves",
+ "method": "io.systemd.Resolve.Monitor.SubscribeQueryResults",
"more": true
}\0' | nc -U /run/systemd/resolve/io.systemd.Resolve.Monitor > $NOTIFICATION_LOGS
EOF
@@ -274,7 +274,7 @@ grep -qF "; fully validated" "$RUN_OUT"
run resolvectl query -t A cname-chain.signed.test
grep -qF "follow14.final.signed.test IN A 10.0.0.14" "$RUN_OUT"
grep -qF "authenticated: yes" "$RUN_OUT"
-notification_check_host "cname-chain.signed.test" "10.0.0.14"
+notification_check_host "follow10.so.close.signed.test" "10.0.0.14"
# Non-existing RR + CNAME chain
run dig +dnssec AAAA cname-chain.signed.test
grep -qF "status: NOERROR" "$RUN_OUT"