]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: dhcp-server: also refuse link local address to use as the server address
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 1 Feb 2022 07:39:43 +0000 (16:39 +0900)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 1 Feb 2022 11:18:53 +0000 (11:18 +0000)
src/network/networkd-dhcp-server.c

index 9acfd17d493da182f4833acf113015ccb83ca898..1c1ca1684c5cf4a60328eb243553bd5a77bab8bd 100644 (file)
@@ -58,12 +58,21 @@ void network_adjust_dhcp_server(Network *network) {
                 ORDERED_HASHMAP_FOREACH(address, network->addresses_by_section) {
                         if (section_is_invalid(address->section))
                                 continue;
-                        if (address->family == AF_INET &&
-                            !in4_addr_is_localhost(&address->in_addr.in) &&
-                            in4_addr_is_null(&address->in_addr_peer.in)) {
-                                have = true;
-                                break;
-                        }
+
+                        if (address->family != AF_INET)
+                                continue;
+
+                        if (in4_addr_is_localhost(&address->in_addr.in))
+                                continue;
+
+                        if (in4_addr_is_link_local(&address->in_addr.in))
+                                continue;
+
+                        if (in4_addr_is_set(&address->in_addr_peer.in))
+                                continue;
+
+                        have = true;
+                        break;
                 }
                 if (!have) {
                         log_warning("%s: DHCPServer= is enabled, but no static address configured. "
@@ -130,6 +139,8 @@ static int link_find_dhcp_server_address(Link *link, Address **ret) {
                         continue;
                 if (in4_addr_is_localhost(&address->in_addr.in))
                         continue;
+                if (in4_addr_is_link_local(&address->in_addr.in))
+                        continue;
                 if (in4_addr_is_set(&address->in_addr_peer.in))
                         continue;