From 9b9c5fff16784b007f6ec313adafd29f4f737ab5 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 12 Oct 2020 08:51:02 +0900 Subject: [PATCH] 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. --- src/network/networkd-address.c | 9 +++++++++ 1 file changed, 9 insertions(+) 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; -- 2.47.3