]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: do not disable mdns/llmnr globally if it's enabled on any link
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 24 Jan 2025 19:48:00 +0000 (04:48 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 25 Jan 2025 01:07:38 +0000 (10:07 +0900)
Fixes a regression caused by 2976730a4d34749bfb7a88da341464f1834ab1c6.

Fixes #36078.
Fixes #36126.

Co-authored-by: Luca Boccassi <luca.boccassi@gmail.com>
src/resolve/resolved-link.c
src/resolve/resolved-llmnr.c
src/resolve/resolved-llmnr.h
src/resolve/resolved-manager.c
src/resolve/resolved-mdns.c
src/resolve/resolved-mdns.h

index 067a0813ec157cad06d35da68aefcb7b78255b56..928137b967a70b26c2ea82da662fd88366946dad 100644 (file)
@@ -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);
index 9469bdac8690a8a2ca7b1fca128022803834dd30..abb9c469604e25c93189793f49d2023130779c37 100644 (file)
@@ -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;
 
index 4cdd2606e6ddb397d3b9c5d1a1cfa3244f0279b9..358201b5df8677db49318019dcd88afa159d4af8 100644 (file)
@@ -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);
index dbaad81734bd117583011f3658a8be92a0f8da4e..5ec946717f2465987b6f0fdb344c7a07c500bb8a 100644 (file)
@@ -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;
 }
 
index 7e9bb693afec5ccfc38905dc99ae51bc682684c0..4e6aade7265b19a80929d18a865801b11fb74e6a 100644 (file)
@@ -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;
 
index 38ef1808dfb69769d21f70b0e12c4e516100116f..c52bce106919565b61b26720df3f2d9efb58a379 100644 (file)
@@ -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);