From: Maria Matejka Date: Fri, 7 Jun 2024 06:59:48 +0000 (+0200) Subject: Fixed deferred route freeing crash X-Git-Tag: v3.0.0~175 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45cd4bbe9c893a3cdaf26ab372aa5c1f29af6cda;p=thirdparty%2Fbird.git Fixed deferred route freeing crash The sending channel may be already gone when rte_free_deferred() is finally called so we have to log about route freeing in the synchronous call instead. --- diff --git a/nest/rt-table.c b/nest/rt-table.c index b06b2cd13..421a5e922 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -558,6 +558,7 @@ rte_free(struct rte_storage *e, struct rtable_private *tab) if (!tab->rte_free_deferred++) rt_lock_table(tab); + rt_rte_trace_in(D_ROUTES, e->rte.sender->req, &e->rte, "freeing"); defer_call(&rfdi.dc, sizeof rfdi); } @@ -571,8 +572,6 @@ rte_free_deferred(struct deferred_call *dc) /* No need for synchronize_rcu, implied by the deferred_call */ - rt_rte_trace_in(D_ROUTES, e->rte.sender->req, &e->rte, "freeing"); - struct netindex *i = RTE_GET_NETINDEX(&e->rte); net_unlock_index(tab->netindex, i);