138 lines
4.5 KiB
Diff
138 lines
4.5 KiB
Diff
From 7addd42c2e01a6b94c9c9dccece74387c9f18344 Mon Sep 17 00:00:00 2001
|
|
From: Yu Watanabe <watanabe.yu+github@gmail.com>
|
|
Date: Sat, 25 Jan 2025 04:48:00 +0900
|
|
Subject: [PATCH] resolved: do not disable mdns/llmnr globally if it's enabled
|
|
on any link
|
|
|
|
Fixes a regression caused by 2976730a4d34749bfb7a88da341464f1834ab1c6.
|
|
|
|
Fixes #36078.
|
|
Fixes #36126.
|
|
|
|
Co-authored-by: Luca Boccassi <luca.boccassi@gmail.com>
|
|
(cherry picked from commit 962b757d9b62e42df2513577d717d730b619c80c)
|
|
---
|
|
src/resolve/resolved-link.c | 7 ++-----
|
|
src/resolve/resolved-llmnr.c | 13 +++++++++++++
|
|
src/resolve/resolved-llmnr.h | 1 +
|
|
src/resolve/resolved-manager.c | 6 ++++++
|
|
src/resolve/resolved-mdns.c | 13 +++++++++++++
|
|
src/resolve/resolved-mdns.h | 1 +
|
|
6 files changed, 36 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/src/resolve/resolved-link.c b/src/resolve/resolved-link.c
|
|
index 067a0813ec..928137b967 100644
|
|
--- a/src/resolve/resolved-link.c
|
|
+++ b/src/resolve/resolved-link.c
|
|
@@ -651,16 +651,13 @@ int link_update(Link *l) {
|
|
r = manager_llmnr_start(l->manager);
|
|
if (r < 0)
|
|
return r;
|
|
- } else
|
|
- manager_llmnr_stop(l->manager);
|
|
-
|
|
+ }
|
|
|
|
if (link_get_mdns_support(l) != RESOLVE_SUPPORT_NO) {
|
|
r = manager_mdns_start(l->manager);
|
|
if (r < 0)
|
|
return r;
|
|
- } else
|
|
- manager_mdns_stop(l->manager);
|
|
+ }
|
|
|
|
link_allocate_scopes(l);
|
|
link_add_rrs(l, false);
|
|
diff --git a/src/resolve/resolved-llmnr.c b/src/resolve/resolved-llmnr.c
|
|
index 9469bdac86..abb9c46960 100644
|
|
--- a/src/resolve/resolved-llmnr.c
|
|
+++ b/src/resolve/resolved-llmnr.c
|
|
@@ -25,6 +25,19 @@ void manager_llmnr_stop(Manager *m) {
|
|
m->llmnr_ipv6_tcp_fd = safe_close(m->llmnr_ipv6_tcp_fd);
|
|
}
|
|
|
|
+void manager_llmnr_maybe_stop(Manager *m) {
|
|
+ assert(m);
|
|
+
|
|
+ /* This stops LLMNR only when no interface enables LLMNR. */
|
|
+
|
|
+ Link *l;
|
|
+ HASHMAP_FOREACH(l, m->links)
|
|
+ if (link_get_llmnr_support(l) != RESOLVE_SUPPORT_NO)
|
|
+ return;
|
|
+
|
|
+ manager_llmnr_stop(m);
|
|
+}
|
|
+
|
|
int manager_llmnr_start(Manager *m) {
|
|
int r;
|
|
|
|
diff --git a/src/resolve/resolved-llmnr.h b/src/resolve/resolved-llmnr.h
|
|
index 4cdd2606e6..358201b5df 100644
|
|
--- a/src/resolve/resolved-llmnr.h
|
|
+++ b/src/resolve/resolved-llmnr.h
|
|
@@ -11,4 +11,5 @@ int manager_llmnr_ipv4_tcp_fd(Manager *m);
|
|
int manager_llmnr_ipv6_tcp_fd(Manager *m);
|
|
|
|
void manager_llmnr_stop(Manager *m);
|
|
+void manager_llmnr_maybe_stop(Manager *m);
|
|
int manager_llmnr_start(Manager *m);
|
|
diff --git a/src/resolve/resolved-manager.c b/src/resolve/resolved-manager.c
|
|
index dbaad81734..5ec946717f 100644
|
|
--- a/src/resolve/resolved-manager.c
|
|
+++ b/src/resolve/resolved-manager.c
|
|
@@ -105,6 +105,9 @@ static int manager_process_link(sd_netlink *rtnl, sd_netlink_message *mm, void *
|
|
break;
|
|
}
|
|
|
|
+ /* Now check all the links, and if mDNS/llmr are disabled everywhere, stop them globally too. */
|
|
+ manager_llmnr_maybe_stop(m);
|
|
+ manager_mdns_maybe_stop(m);
|
|
return 0;
|
|
|
|
fail:
|
|
@@ -287,6 +290,9 @@ static int on_network_event(sd_event_source *s, int fd, uint32_t revents, void *
|
|
(void) manager_write_resolv_conf(m);
|
|
(void) manager_send_changed(m, "DNS");
|
|
|
|
+ /* Now check all the links, and if mDNS/llmr are disabled everywhere, stop them globally too. */
|
|
+ manager_llmnr_maybe_stop(m);
|
|
+ manager_mdns_maybe_stop(m);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/src/resolve/resolved-mdns.c b/src/resolve/resolved-mdns.c
|
|
index 7e9bb693af..4e6aade726 100644
|
|
--- a/src/resolve/resolved-mdns.c
|
|
+++ b/src/resolve/resolved-mdns.c
|
|
@@ -22,6 +22,19 @@ void manager_mdns_stop(Manager *m) {
|
|
m->mdns_ipv6_fd = safe_close(m->mdns_ipv6_fd);
|
|
}
|
|
|
|
+void manager_mdns_maybe_stop(Manager *m) {
|
|
+ assert(m);
|
|
+
|
|
+ /* This stops mDNS only when no interface enables mDNS. */
|
|
+
|
|
+ Link *l;
|
|
+ HASHMAP_FOREACH(l, m->links)
|
|
+ if (link_get_mdns_support(l) != RESOLVE_SUPPORT_NO)
|
|
+ return;
|
|
+
|
|
+ manager_mdns_stop(m);
|
|
+}
|
|
+
|
|
int manager_mdns_start(Manager *m) {
|
|
int r;
|
|
|
|
diff --git a/src/resolve/resolved-mdns.h b/src/resolve/resolved-mdns.h
|
|
index 38ef1808df..c52bce1069 100644
|
|
--- a/src/resolve/resolved-mdns.h
|
|
+++ b/src/resolve/resolved-mdns.h
|
|
@@ -10,4 +10,5 @@ int manager_mdns_ipv4_fd(Manager *m);
|
|
int manager_mdns_ipv6_fd(Manager *m);
|
|
|
|
void manager_mdns_stop(Manager *m);
|
|
+void manager_mdns_maybe_stop(Manager *m);
|
|
int manager_mdns_start(Manager *m);
|