From fe0acbf7e061eb5be2708f0dbb9275084abc97af Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 2 Feb 2024 13:08:35 +0900 Subject: [PATCH] network: set 'removing' flag to remembered object Previously, if address_remove() or friends called with a temporary object, the removing flag is assigned to the temporary object, and is not set to the remembered object. Hence, e.g. route_is_ready_to_configure() wrongly judge a required address for a route is (still) ready, hence networkd fails to configure the route. Fixes #28009. --- src/network/networkd-address.c | 3 +++ src/network/networkd-neighbor.c | 3 +++ src/network/networkd-nexthop.c | 3 +++ src/network/networkd-route.c | 4 ++++ 4 files changed, 13 insertions(+) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 848e9e1b8c..a7aa166b4b 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -1155,6 +1155,9 @@ int address_remove(Address *address, Link *link) { assert(link->manager); assert(link->manager->rtnl); + /* If the address is remembered, use the remembered object. */ + (void) address_get(link, address, &address); + log_address_debug(address, "Removing", link); r = sd_rtnl_message_new_addr(link->manager->rtnl, &m, RTM_DELADDR, diff --git a/src/network/networkd-neighbor.c b/src/network/networkd-neighbor.c index d30282fe1e..4347a1d282 100644 --- a/src/network/networkd-neighbor.c +++ b/src/network/networkd-neighbor.c @@ -442,6 +442,9 @@ int neighbor_remove(Neighbor *neighbor, Link *link) { assert(link->manager); assert(link->manager->rtnl); + /* If the neighbor is remembered, then use the remembered object. */ + (void) neighbor_get(link, neighbor, &neighbor); + log_neighbor_debug(neighbor, "Removing", link); r = sd_rtnl_message_new_neigh(link->manager->rtnl, &m, RTM_DELNEIGH, diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index 07a971a0e9..56abd3908a 100644 --- a/src/network/networkd-nexthop.c +++ b/src/network/networkd-nexthop.c @@ -552,6 +552,9 @@ int nexthop_remove(NextHop *nexthop, Manager *manager) { assert(nexthop->id > 0); assert(manager); + /* If the nexthop is remembered, then use the remembered object. */ + (void) nexthop_get_by_id(manager, PTR_TO_UINT32(nexthop->id), &nexthop); + /* link may be NULL. */ (void) link_get_by_index(manager, nexthop->ifindex, &link); diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 80e20a286b..b0bc732054 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -575,8 +575,12 @@ int route_remove(Route *route, Manager *manager) { assert(route); assert(manager); + /* If the route is remembered, then use the remembered object. */ + (void) route_get(manager, route, &route); + log_route_debug(route, "Removing", manager); + /* For logging. */ (void) route_get_link(manager, route, &link); r = sd_rtnl_message_new_route(manager->rtnl, &m, RTM_DELROUTE, route->family, route->protocol);