]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
rtnetlink: do not assume RTNL is held in link_master_filtered()
authorEric Dumazet <edumazet@google.com>
Mon, 25 May 2026 08:35:41 +0000 (08:35 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 27 May 2026 02:20:15 +0000 (19:20 -0700)
RTNL might be no longer held by the caller in the following patch.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260525083542.1565964-5-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/rtnetlink.c

index 6041e008b22dbfd164ede6d50a77d2db5d7e2e23..0a59036d5f933c5b2f123a47e059036d2a555911 100644 (file)
@@ -2371,22 +2371,24 @@ static struct rtnl_link_ops *linkinfo_to_kind_ops(const struct nlattr *nla,
 static bool link_master_filtered(struct net_device *dev, int master_idx)
 {
        struct net_device *master;
+       bool res = false;
 
        if (!master_idx)
                return false;
 
-       master = netdev_master_upper_dev_get(dev);
+       rcu_read_lock();
+       master = netdev_master_upper_dev_get_rcu(dev);
 
        /* 0 is already used to denote IFLA_MASTER wasn't passed, therefore need
         * another invalid value for ifindex to denote "no master".
         */
        if (master_idx == -1)
-               return !!master;
-
-       if (!master || master->ifindex != master_idx)
-               return true;
+               res = !!master;
+       else if (!master || master->ifindex != master_idx)
+               res = true;
+       rcu_read_unlock();
 
-       return false;
+       return res;
 }
 
 static bool link_kind_filtered(const struct net_device *dev,