Skip to content

Commit 69b0216

Browse files
nikolay@redhat.comdavem330
authored andcommitted
bonding: fix bonding_masters race condition in bond unloading
While the bonding module is unloading, it is considered that after rtnl_link_unregister all bond devices are destroyed but since no synchronization mechanism exists, a new bond device can be created via bonding_masters before unregister_pernet_subsys which would lead to multiple problems (e.g. NULL pointer dereference, wrong RIP, list corruption). This patch fixes the issue by removing any bond devices left in the netns after bonding_masters is removed from sysfs. Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com> Acked-by: Veaceslav Falico <vfalico@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent ffcdedb commit 69b0216

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

drivers/net/bonding/bond_main.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4846,9 +4846,18 @@ static int __net_init bond_net_init(struct net *net)
48464846
static void __net_exit bond_net_exit(struct net *net)
48474847
{
48484848
struct bond_net *bn = net_generic(net, bond_net_id);
4849+
struct bonding *bond, *tmp_bond;
4850+
LIST_HEAD(list);
48494851

48504852
bond_destroy_sysfs(bn);
48514853
bond_destroy_proc_dir(bn);
4854+
4855+
/* Kill off any bonds created after unregistering bond rtnl ops */
4856+
rtnl_lock();
4857+
list_for_each_entry_safe(bond, tmp_bond, &bn->dev_list, bond_list)
4858+
unregister_netdevice_queue(bond->dev, &list);
4859+
unregister_netdevice_many(&list);
4860+
rtnl_unlock();
48524861
}
48534862

48544863
static struct pernet_operations bond_net_ops = {

0 commit comments

Comments
 (0)