]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: directly compare with in_addr element for IPv4 case
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 11 Oct 2020 23:51:02 +0000 (08:51 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 13 Oct 2020 11:30:16 +0000 (20:30 +0900)
When peer address is set, address_compare_func() (or address_equal())
does not work in link_is_static_address_configured(), as an Address object
stored in a Link does not contain peer addresses. So, we need to also
compare with in_addr element for IPv4 case.

Fixes #17304.

src/network/networkd-address.c

index 7407eeec9bcdf89981c1d4135eab3e8ef280e6db..5146aade714a8ac7d212139fe2014db38aab4c4d 100644 (file)
@@ -550,6 +550,15 @@ static bool link_is_static_address_configured(Link *link, Address *address) {
                         return true;
                 else if (address->family == AF_INET6 && net_address->family == AF_INET6 &&
                          in_addr_equal(AF_INET6, &address->in_addr, &net_address->in_addr_peer) > 0)
+                        /* When Peer= is set, then address_equal() in the above returns false, as
+                         * address->in_addr is the peer address. */
+                        return true;
+                else if (address->family == AF_INET && net_address->family == AF_INET &&
+                         in_addr_equal(AF_INET, &address->in_addr, &net_address->in_addr) > 0)
+                        /* Even if both in_addr elements are equivalent, address_equal() may return
+                         * false when Peer= is set, as Address object in Network contains the peer
+                         * address but Address stored in Link does not, and address_prefix() in
+                         * address_compare_func() may provide different prefix. */
                         return true;
 
         return false;