Skip to content

Commit

Permalink
ethtool: check device is present when getting ioctl settings
Browse files Browse the repository at this point in the history
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]
  torvalds#8 [ffffa2021d70f948] qede_get_link_ksettings at ffffffffc07bfa9a [qede]
  torvalds#9 [ffffa2021d70f9d0] __rh_call_get_link_ksettings at ffffffff9bad2723
 torvalds#10 [ffffa2021d70fa30] ethtool_get_settings at ffffffff9bad29d0
 torvalds#11 [ffffa2021d70fb18] __dev_ethtool at ffffffff9bad442b
 torvalds#12 [ffffa2021d70fc28] dev_ethtool at ffffffff9bad6db8
 torvalds#13 [ffffa2021d70fc60] dev_ioctl at ffffffff9ba7a55c
 torvalds#14 [ffffa2021d70fc98] sock_do_ioctl at ffffffff9ba22a44
 torvalds#15 [ffffa2021d70fd08] sock_ioctl at ffffffff9ba22d1c
 torvalds#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 a699781 ("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: 4bc71cb ("net: consolidate and fix ethtool_ops->get_settings calling")
Fixes: 3f1ac7a ("net: ethtool: add new ETHTOOL_xLINKSETTINGS API")
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Tested-by: John J Coleman <jjcolemanx86@gmail.com>
Co-developed-by: Jamie Bainbridge <jamie.bainbridge@gmail.com>
Signed-off-by: Jamie Bainbridge <jamie.bainbridge@gmail.com>
Signed-off-by: John J Coleman <jjcolemanx86@gmail.com>
Signed-off-by: NipaLocal <nipa@local>
  • Loading branch information
John J Coleman authored and NipaLocal committed Feb 10, 2025
1 parent 8ce774c commit 6bd0918
Showing 1 changed file with 3 additions and 0 deletions.
3 changes: 3 additions & 0 deletions net/ethtool/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down

0 comments on commit 6bd0918

Please sign in to comment.