From: Yu Watanabe Date: Wed, 20 Nov 2024 16:57:44 +0000 (+0900) Subject: network/ndisc: unref Route objects that depend on the nexthop X-Git-Tag: v258-rc1~1883^2~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=96fef18ca683e60a1a31b2c1ab88bbecea60996d;p=thirdparty%2Fsystemd.git 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. --- diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index eb557e580ee..8e101ad779b 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) {