From 6bd09182691efdaf3a0aadbc88f06c9a8fc350f8 Mon Sep 17 00:00:00 2001 From: John J Coleman Date: Sun, 9 Feb 2025 17:31:56 -0700 Subject: [PATCH] ethtool: check device is present when getting ioctl settings An ioctl caller of SIOCETHTOOL ETHTOOL_GSET can provoke the legacy ethtool codepath on a non-present device, leading to kernel panic: [exception RIP: qed_get_current_link+0x11] #8 [ffffa2021d70f948] qede_get_link_ksettings at ffffffffc07bfa9a [qede] #9 [ffffa2021d70f9d0] __rh_call_get_link_ksettings at ffffffff9bad2723 #10 [ffffa2021d70fa30] ethtool_get_settings at ffffffff9bad29d0 #11 [ffffa2021d70fb18] __dev_ethtool at ffffffff9bad442b #12 [ffffa2021d70fc28] dev_ethtool at ffffffff9bad6db8 #13 [ffffa2021d70fc60] dev_ioctl at ffffffff9ba7a55c #14 [ffffa2021d70fc98] sock_do_ioctl at ffffffff9ba22a44 #15 [ffffa2021d70fd08] sock_ioctl at ffffffff9ba22d1c #16 [ffffa2021d70fd78] do_vfs_ioctl at ffffffff9b584cf4 Device is not present with no state bits set: crash> net_device.state ffff8fff95240000 state = 0x0, Existing patch commit a699781c79ec ("ethtool: check device is present when getting link settings") fixes this in the modern sysfs reader's ksettings path. Fix this in the legacy ioctl path by checking for device presence as well. Fixes: 4bc71cb983fd2 ("net: consolidate and fix ethtool_ops->get_settings calling") Fixes: 3f1ac7a700d03 ("net: ethtool: add new ETHTOOL_xLINKSETTINGS API") Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Tested-by: John J Coleman Co-developed-by: Jamie Bainbridge Signed-off-by: Jamie Bainbridge Signed-off-by: John J Coleman Signed-off-by: NipaLocal --- net/ethtool/ioctl.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c index 98b7dcea207a64..ab3c87cf832249 100644 --- a/net/ethtool/ioctl.c +++ b/net/ethtool/ioctl.c @@ -659,6 +659,9 @@ static int ethtool_get_settings(struct net_device *dev, void __user *useraddr) int err; ASSERT_RTNL(); + if (!netif_device_present(dev)) + return -ENODEV; + if (!dev->ethtool_ops->get_link_ksettings) return -EOPNOTSUPP;