]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: set 'removing' flag to remembered object
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 2 Feb 2024 04:08:35 +0000 (13:08 +0900)
committerLuca Boccassi <luca.boccassi@gmail.com>
Wed, 7 Feb 2024 10:25:19 +0000 (10:25 +0000)
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
src/network/networkd-neighbor.c
src/network/networkd-nexthop.c
src/network/networkd-route.c

index 848e9e1b8cf4896c8dee2b3c479f470a7ef11269..a7aa166b4bb0607ab80626ab37924d3ed1757513 100644 (file)
@@ -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,
index d30282fe1ee547e25e9ac5c70400f4b85b5e28b9..4347a1d282d891f37cb74b7f1d04a5845240b762 100644 (file)
@@ -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,
index 07a971a0e9265b71e37c7ac56fe0d31643be5cb2..56abd3908a423f427cb7b7a0d597b2c2f65789d1 100644 (file)
@@ -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);
 
index 80e20a286b0ba7a139e80ae68b2850d0fc4b6577..b0bc73205459fb85577fc101cdf74540b3e8bb52 100644 (file)
@@ -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);