]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: ethtool: Use hwprov under rcu_read_lock
authorLi RongQing <lirongqing@baidu.com>
Thu, 9 Jan 2025 11:10:57 +0000 (19:10 +0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 11 Jan 2025 02:14:24 +0000 (18:14 -0800)
hwprov should be protected by rcu_read_lock to prevent possible UAF

Fixes: 4c61d809cf60 ("net: ethtool: Fix suspicious rcu_dereference usage")
Signed-off-by: Li RongQing <lirongqing@baidu.com>
Acked-by: Kory Maincent <kory.maincent@bootlin.com>
diff with v1: move and use err varialbe, instead of define a new variable

 net/ethtool/common.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Link: https://patch.msgid.link/20250109111057.4746-1-lirongqing@baidu.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ethtool/common.c

index 2607aea1fbfb269465797795816df7d594311160..2bd77c94f9f1addaf5559e652f09cca715ca308e 100644 (file)
@@ -869,6 +869,7 @@ int __ethtool_get_ts_info(struct net_device *dev,
                          struct kernel_ethtool_ts_info *info)
 {
        struct hwtstamp_provider *hwprov;
+       int err = 0;
 
        rcu_read_lock();
        hwprov = rcu_dereference(dev->hwprov);
@@ -876,7 +877,6 @@ int __ethtool_get_ts_info(struct net_device *dev,
        if (!hwprov) {
                const struct ethtool_ops *ops = dev->ethtool_ops;
                struct phy_device *phydev = dev->phydev;
-               int err = 0;
 
                ethtool_init_tsinfo(info);
                if (phy_is_default_hwtstamp(phydev) &&
@@ -892,8 +892,9 @@ int __ethtool_get_ts_info(struct net_device *dev,
                return err;
        }
 
+       err = ethtool_get_ts_info_by_phc(dev, info, &hwprov->desc);
        rcu_read_unlock();
-       return ethtool_get_ts_info_by_phc(dev, info, &hwprov->desc);
+       return err;
 }
 
 bool net_support_hwtstamp_qualifier(struct net_device *dev,