Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 43638900 authored by David S. Miller's avatar David S. Miller
Browse files

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: 317f4810 ("rtnl: allow to create device with IFLA_LINK_NETNSID set")
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7768eed8
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -2166,28 +2166,28 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh)
			}
		}
		err = rtnl_configure_link(dev, ifm);
		if (err < 0) {
			if (ops->newlink) {
				LIST_HEAD(list_kill);

				ops->dellink(dev, &list_kill);
				unregister_netdevice_many(&list_kill);
			} else {
				unregister_netdevice(dev);
			}
			goto out;
		}

		if (err < 0)
			goto out_unregister;
		if (link_net) {
			err = dev_change_net_namespace(dev, dest_net, ifname);
			if (err < 0)
				unregister_netdevice(dev);
				goto out_unregister;
		}
out:
		if (link_net)
			put_net(link_net);
		put_net(dest_net);
		return err;
out_unregister:
		if (ops->newlink) {
			LIST_HEAD(list_kill);

			ops->dellink(dev, &list_kill);
			unregister_netdevice_many(&list_kill);
		} else {
			unregister_netdevice(dev);
		}
		goto out;
	}
}