]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
rtnetlink: Try the outer netns attribute in rtnl_get_peer_net().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Mon, 16 Dec 2024 11:04:32 +0000 (20:04 +0900)
committerJakub Kicinski <kuba@kernel.org>
Wed, 18 Dec 2024 01:54:18 +0000 (17:54 -0800)
Xiao Liang reported that the cited commit changed netns handling
in newlink() of netkit, veth, and vxcan.

Before the patch, if we don't find a netns attribute in the peer
device attributes, we tried to find another netns attribute in
the outer netlink attributes by passing it to rtnl_link_get_net().

Let's restore the original behaviour.

Fixes: 48327566769a ("rtnetlink: fix double call of rtnl_link_get_net_ifla()")
Reported-by: Xiao Liang <shaw.leon@gmail.com>
Closes: https://lore.kernel.org/netdev/CABAhCORBVVU8P6AHcEkENMj+gD2d3ce9t=A_o48E0yOQp8_wUQ@mail.gmail.com/#t
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Tested-by: Xiao Liang <shaw.leon@gmail.com>
Link: https://patch.msgid.link/20241216110432.51488-1-kuniyu@amazon.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/rtnetlink.c

index ebcfc2debf1a3d5de1f4bc42dd748c20f07b680e..d9f959c619d9590686701b5b04996e32a8583691 100644 (file)
@@ -3819,6 +3819,7 @@ out_unregister:
 }
 
 static struct net *rtnl_get_peer_net(const struct rtnl_link_ops *ops,
+                                    struct nlattr *tbp[],
                                     struct nlattr *data[],
                                     struct netlink_ext_ack *extack)
 {
@@ -3826,7 +3827,7 @@ static struct net *rtnl_get_peer_net(const struct rtnl_link_ops *ops,
        int err;
 
        if (!data || !data[ops->peer_type])
-               return NULL;
+               return rtnl_link_get_net_ifla(tbp);
 
        err = rtnl_nla_parse_ifinfomsg(tb, data[ops->peer_type], extack);
        if (err < 0)
@@ -3971,7 +3972,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh,
                }
 
                if (ops->peer_type) {
-                       peer_net = rtnl_get_peer_net(ops, data, extack);
+                       peer_net = rtnl_get_peer_net(ops, tb, data, extack);
                        if (IS_ERR(peer_net)) {
                                ret = PTR_ERR(peer_net);
                                goto put_ops;