Skip to content

Commit d09486a

Browse files
kuba-moodavem330
authored andcommitted
net: fix removing a namespace with conflicting altnames
Mark reports a BUG() when a net namespace is removed. kernel BUG at net/core/dev.c:11520! Physical interfaces moved outside of init_net get "refunded" to init_net when that namespace disappears. The main interface name may get overwritten in the process if it would have conflicted. We need to also discard all conflicting altnames. Recent fixes addressed ensuring that altnames get moved with the main interface, which surfaced this problem. Reported-by: Марк Коренберг <socketpair@gmail.com> Link: https://lore.kernel.org/all/CAEmTpZFZ4Sv3KwqFOY2WKDHeZYdi0O7N5H1nTvcGp=SAEavtDg@mail.gmail.com/ Fixes: 7663d52 ("net: check for altname conflicts when changing netdev's netns") Signed-off-by: Jakub Kicinski <kuba@kernel.org> Reviewed-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Jiri Pirko <jiri@nvidia.com> Reviewed-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 359724f commit d09486a

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

net/core/dev.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11551,6 +11551,7 @@ static struct pernet_operations __net_initdata netdev_net_ops = {
1155111551

1155211552
static void __net_exit default_device_exit_net(struct net *net)
1155311553
{
11554+
struct netdev_name_node *name_node, *tmp;
1155411555
struct net_device *dev, *aux;
1155511556
/*
1155611557
* Push all migratable network devices back to the
@@ -11573,6 +11574,14 @@ static void __net_exit default_device_exit_net(struct net *net)
1157311574
snprintf(fb_name, IFNAMSIZ, "dev%d", dev->ifindex);
1157411575
if (netdev_name_in_use(&init_net, fb_name))
1157511576
snprintf(fb_name, IFNAMSIZ, "dev%%d");
11577+
11578+
netdev_for_each_altname_safe(dev, name_node, tmp)
11579+
if (netdev_name_in_use(&init_net, name_node->name)) {
11580+
netdev_name_node_del(name_node);
11581+
synchronize_rcu();
11582+
__netdev_name_node_alt_destroy(name_node);
11583+
}
11584+
1157611585
err = dev_change_net_namespace(dev, &init_net, fb_name);
1157711586
if (err) {
1157811587
pr_emerg("%s: failed to move %s to init_net: %d\n",

net/core/dev.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ int dev_change_name(struct net_device *dev, const char *newname);
6363

6464
#define netdev_for_each_altname(dev, namenode) \
6565
list_for_each_entry((namenode), &(dev)->name_node->list, list)
66+
#define netdev_for_each_altname_safe(dev, namenode, next) \
67+
list_for_each_entry_safe((namenode), (next), &(dev)->name_node->list, \
68+
list)
6669

6770
int netdev_name_node_alt_create(struct net_device *dev, const char *name);
6871
int netdev_name_node_alt_destroy(struct net_device *dev, const char *name);

0 commit comments

Comments
 (0)