]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ipv4: fib: Avoid calling fib_trie_table() in fib_new_table() for dying net.
authorKuniyuki Iwashima <kuniyu@google.com>
Fri, 12 Jun 2026 06:32:07 +0000 (06:32 +0000)
committerJakub Kicinski <kuba@kernel.org>
Mon, 15 Jun 2026 18:49:28 +0000 (11:49 -0700)
We will call ip_fib_net_exit() from ->exit_rtnl().

All fib_table will be destroyed before devices are unregistered.

During device unregistration, inetdev_destroy() could call
fib_del_ifaddr(), which calls fib_magic(RTM_DELROUTE).

fib_magic() calls fib_new_table(), but we do not want to create
a new table after ip_fib_net_exit() destroys all tables.

As a prep, let's add check_net() before fib_trie_table() in
fib_new_table().

fib_trie_table() is also called from fib_trie_unmerge(), but
fib_get_table() fails first in fib_unmerge(), so the same
problem does not occur there.

Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260612063225.455191-5-kuniyu@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv4/fib_frontend.c

index c3e3b5633fd0674ad35cb7cb3ef034c3a4030695..d147471d1d8e486e7e9d8661ec8e46ac15ae15f1 100644 (file)
@@ -88,7 +88,8 @@ struct fib_table *fib_new_table(struct net *net, u32 id)
        if (id == RT_TABLE_LOCAL && !net->ipv4.fib_has_custom_rules)
                alias = fib_new_table(net, RT_TABLE_MAIN);
 
-       tb = fib_trie_table(id, alias);
+       if (check_net(net))
+               tb = fib_trie_table(id, alias);
        if (!tb)
                return NULL;