From: Yu Watanabe Date: Fri, 2 Feb 2024 04:08:35 +0000 (+0900) Subject: network: set 'removing' flag to remembered object X-Git-Tag: v256-rc1~953 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fe0acbf7e061eb5be2708f0dbb9275084abc97af;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 848e9e1b8cf..a7aa166b4bb 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 d30282fe1ee..4347a1d282d 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 07a971a0e92..56abd3908a4 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 80e20a286b0..b0bc7320545 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);