0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-11-08 12:18:42 +00:00

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.
This commit is contained in:
Maria Matejka 2024-06-07 08:59:48 +02:00
parent b548ffe197
commit 45cd4bbe9c

View File

@ -558,6 +558,7 @@ rte_free(struct rte_storage *e, struct rtable_private *tab)
if (!tab->rte_free_deferred++) if (!tab->rte_free_deferred++)
rt_lock_table(tab); rt_lock_table(tab);
rt_rte_trace_in(D_ROUTES, e->rte.sender->req, &e->rte, "freeing");
defer_call(&rfdi.dc, sizeof rfdi); 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 */ /* 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); struct netindex *i = RTE_GET_NETINDEX(&e->rte);
net_unlock_index(tab->netindex, i); net_unlock_index(tab->netindex, i);