From: Yu Watanabe Date: Sun, 11 Oct 2020 23:51:02 +0000 (+0900) Subject: network: directly compare with in_addr element for IPv4 case X-Git-Tag: v247-rc1~82^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9b9c5fff16784b007f6ec313adafd29f4f737ab5;p=thirdparty%2Fsystemd.git network: directly compare with in_addr element for IPv4 case 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. --- diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 7407eeec9bc..5146aade714 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -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;