Skip to content

Commit 4363890

Browse files
committed
net: Handle unregister properly when netdev namespace change fails.
If rtnl_newlink() fails on it's call to dev_change_net_namespace(), we have to make use of the ->dellink() method, if present, just like we do when rtnl_configure_link() fails. Fixes: 317f481 ("rtnl: allow to create device with IFLA_LINK_NETNSID set") Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 7768eed commit 4363890

File tree

1 file changed

+13
-13
lines changed

1 file changed

+13
-13
lines changed

net/core/rtnetlink.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2166,28 +2166,28 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh)
21662166
}
21672167
}
21682168
err = rtnl_configure_link(dev, ifm);
2169-
if (err < 0) {
2170-
if (ops->newlink) {
2171-
LIST_HEAD(list_kill);
2172-
2173-
ops->dellink(dev, &list_kill);
2174-
unregister_netdevice_many(&list_kill);
2175-
} else {
2176-
unregister_netdevice(dev);
2177-
}
2178-
goto out;
2179-
}
2180-
2169+
if (err < 0)
2170+
goto out_unregister;
21812171
if (link_net) {
21822172
err = dev_change_net_namespace(dev, dest_net, ifname);
21832173
if (err < 0)
2184-
unregister_netdevice(dev);
2174+
goto out_unregister;
21852175
}
21862176
out:
21872177
if (link_net)
21882178
put_net(link_net);
21892179
put_net(dest_net);
21902180
return err;
2181+
out_unregister:
2182+
if (ops->newlink) {
2183+
LIST_HEAD(list_kill);
2184+
2185+
ops->dellink(dev, &list_kill);
2186+
unregister_netdevice_many(&list_kill);
2187+
} else {
2188+
unregister_netdevice(dev);
2189+
}
2190+
goto out;
21912191
}
21922192
}
21932193

0 commit comments

Comments
 (0)