From: Jiayuan Chen <jiayuan.chen@linux.dev>
To: linux-rdma@vger.kernel.org, netdev@vger.kernel.org
Cc: Jiayuan Chen <jiayuan.chen@shopee.com>,
Jianzhou Zhao <luckd0g@163.com>,
Jiayuan Chen <jiayuan.chen@linux.dev>,
Jason Gunthorpe <jgg@ziepe.ca>, Leon Romanovsky <leon@kernel.org>,
Mark Bloch <mbloch@nvidia.com>,
Edward Srouji <edwards@nvidia.com>,
Or Har-Toov <ohartoov@nvidia.com>,
Kalesh AP <kalesh-anakkur.purayil@broadcom.com>,
Patrisious Haddad <phaddad@nvidia.com>,
Maher Sanalla <msanalla@nvidia.com>,
Yishai Hadas <yishaih@nvidia.com>, Kees Cook <kees@kernel.org>,
Jang Ingyu <ingyujang25@korea.ac.kr>,
Moni Shoua <monis@mellanox.com>,
Doug Ledford <dledford@redhat.com>,
Christian Benvenuti <benve@cisco.com>,
Selvin Xavier <selvin.xavier@broadcom.com>,
Yuval Shaia <yuval.shaia@oracle.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH net v1] IB/core: Fix use-after-free of ipvlan phy_dev in ib_get_eth_speed
Date: Wed, 11 Mar 2026 18:03:08 +0800 [thread overview]
Message-ID: <20260311100313.284589-1-jiayuan.chen@linux.dev> (raw)
From: Jiayuan Chen <jiayuan.chen@shopee.com>
Jianzhou Zhao reported a NULL pointer dereference in
__ethtool_get_link_ksettings [1]. The root cause is a use-after-free
of ipvlan->phy_dev.
In ib_get_eth_speed(), ib_device_get_netdev() obtains a reference to the
ipvlan device outside of rtnl_lock(). This creates a race window: between
ib_device_get_netdev() and rtnl_lock(), the underlying phy_dev (e.g. a
dummy device) can be unregistered and freed by another thread. When the
ethtool call later recurses through ipvlan_ethtool_get_link_ksettings()
into the freed phy_dev, it dereferences freed memory whose ethtool_ops
reads as NULL, causing the crash at offset 0x1f8.
Fix this by moving ib_device_get_netdev() inside the rtnl_lock() section
so that netdev lookup and the ethtool call are atomic with respect to
device unregistration. Under RTNL, if the phy_dev has been deleted, the
ipvlan device is also unregistered and ib_device_get_netdev() returns NULL
safely.
None of the existing callers of ib_get_eth_speed() hold rtnl_lock, so this
change does not introduce any deadlock.
[1] https://lore.kernel.org/netdev/94089b74-def5-4dd0-9143-1cfbc722fe73@linux.dev/T/#t
Fixes: d41861942fc5 ("IB/core: Add generic function to extract IB speed from netdev")
Reported-by: Jianzhou Zhao <luckd0g@163.com>
Closes: https://lore.kernel.org/netdev/94089b74-def5-4dd0-9143-1cfbc722fe73@linux.dev/T/#t
Cc: Jiayuan Chen <jiayuan.chen@linux.dev>
Signed-off-by: Jiayuan Chen <jiayuan.chen@shopee.com>
---
drivers/infiniband/core/verbs.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
index 575b4a4b200b..f16d11e7c2e3 100644
--- a/drivers/infiniband/core/verbs.c
+++ b/drivers/infiniband/core/verbs.c
@@ -2046,11 +2046,13 @@ int ib_get_eth_speed(struct ib_device *dev, u32 port_num, u16 *speed, u8 *width)
if (rdma_port_get_link_layer(dev, port_num) != IB_LINK_LAYER_ETHERNET)
return -EINVAL;
+ rtnl_lock();
netdev = ib_device_get_netdev(dev, port_num);
- if (!netdev)
+ if (!netdev) {
+ rtnl_unlock();
return -ENODEV;
+ }
- rtnl_lock();
rc = __ethtool_get_link_ksettings(netdev, &lksettings);
rtnl_unlock();
--
2.43.0
next reply other threads:[~2026-03-11 10:05 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-11 10:03 Jiayuan Chen [this message]
2026-03-12 3:26 ` [PATCH net v1] IB/core: Fix use-after-free of ipvlan phy_dev in ib_get_eth_speed Jakub Kicinski
2026-03-16 16:29 ` Leon Romanovsky
2026-03-17 9:48 ` Jiayuan Chen
2026-03-17 13:41 ` Leon Romanovsky
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260311100313.284589-1-jiayuan.chen@linux.dev \
--to=jiayuan.chen@linux.dev \
--cc=benve@cisco.com \
--cc=dledford@redhat.com \
--cc=edwards@nvidia.com \
--cc=ingyujang25@korea.ac.kr \
--cc=jgg@ziepe.ca \
--cc=jiayuan.chen@shopee.com \
--cc=kalesh-anakkur.purayil@broadcom.com \
--cc=kees@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=luckd0g@163.com \
--cc=mbloch@nvidia.com \
--cc=monis@mellanox.com \
--cc=msanalla@nvidia.com \
--cc=netdev@vger.kernel.org \
--cc=ohartoov@nvidia.com \
--cc=phaddad@nvidia.com \
--cc=selvin.xavier@broadcom.com \
--cc=yishaih@nvidia.com \
--cc=yuval.shaia@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox