From 96fef18ca683e60a1a31b2c1ab88bbecea60996d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 21 Nov 2024 01:57:44 +0900 Subject: [PATCH] network/ndisc: unref Route objects that depend on the nexthop No functional change, as when this function is called, the set will be freed and contained Route objects will be unref()ed anyway soon later by nexthop_detach() -> nexthop_free(). Even though, when the routes are forgotten from the Manager, then it is not necessary to keep them by the nexthop. Let's unref earlier. --- src/network/networkd-nexthop.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index eb557e580e..8e101ad779 100644 --- a/src/network/networkd-nexthop.c +++ b/src/network/networkd-nexthop.c @@ -493,8 +493,11 @@ static void nexthop_forget_dependents(NextHop *nexthop, Manager *manager) { /* If a nexthop is removed, the kernel silently removes routes that depend on the removed nexthop. * Let's forget them. */ - Route *route; - SET_FOREACH(route, nexthop->routes) { + for (;;) { + _cleanup_(route_unrefp) Route *route = set_steal_first(nexthop->routes); + if (!route) + break; + Request *req; if (route_get_request(manager, route, &req) >= 0) route_enter_removed(req->userdata); @@ -503,6 +506,8 @@ static void nexthop_forget_dependents(NextHop *nexthop, Manager *manager) { log_route_debug(route, "Forgetting silently removed", manager); route_detach(route); } + + nexthop->routes = set_free(nexthop->routes); } static int nexthop_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, RemoveRequest *rreq) {