From: Leon Romanovsky <leon@kernel.org>
To: Jiayuan Chen <jiayuan.chen@linux.dev>
Cc: linux-rdma@vger.kernel.org, netdev@vger.kernel.org,
Jiayuan Chen <jiayuan.chen@shopee.com>,
Jianzhou Zhao <luckd0g@163.com>, Jason Gunthorpe <jgg@ziepe.ca>,
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: Re: [PATCH net v1] IB/core: Fix use-after-free of ipvlan phy_dev in ib_get_eth_speed
Date: Mon, 16 Mar 2026 18:29:09 +0200 [thread overview]
Message-ID: <20260316162909.GG61385@unreal> (raw)
In-Reply-To: <20260311100313.284589-1-jiayuan.chen@linux.dev>
On Wed, Mar 11, 2026 at 06:03:08PM +0800, Jiayuan Chen wrote:
> 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.
If ib_device_get_netdev() worked as it was supposed to work, it can't.
That function grabs reference on netdev and returns or netdev with elevated
reference counter which can't be freed or returns NULL.
Thanks
> 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 prev parent reply other threads:[~2026-03-16 16:29 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-11 10:03 [PATCH net v1] IB/core: Fix use-after-free of ipvlan phy_dev in ib_get_eth_speed Jiayuan Chen
2026-03-12 3:26 ` Jakub Kicinski
2026-03-16 16:29 ` Leon Romanovsky [this message]
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=20260316162909.GG61385@unreal \
--to=leon@kernel.org \
--cc=benve@cisco.com \
--cc=dledford@redhat.com \
--cc=edwards@nvidia.com \
--cc=ingyujang25@korea.ac.kr \
--cc=jgg@ziepe.ca \
--cc=jiayuan.chen@linux.dev \
--cc=jiayuan.chen@shopee.com \
--cc=kalesh-anakkur.purayil@broadcom.com \
--cc=kees@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