[PATCH V4 06/14] i3c: master: Fix potential UAF in i3c_device_uevent()
Frank Li
Frank.li at oss.nxp.com
Thu Aug 6 11:33:51 PDT 2026
On Thu, Aug 06, 2026 at 04:18:49PM +0300, Adrian Hunter wrote:
> i3c_device_uevent() dereferences i3cdev->desc without holding the bus
> normal-use lock. Since the descriptor pointer can be replaced
> concurrently, including when a uevent is generated from sysfs, this can
> result in dereferencing a stale descriptor and lead to a use-after-free.
>
> Use i3c_device_get_info() instead, which protects access to the
> descriptor with the normal-use lock.
>
> Commit 6cf7b65f7029 ("i3c: Use i3cdev->desc->info instead of calling
> i3c_device_get_info() to avoid deadlock") replaced the accessor with a
> direct descriptor dereference because i3c_device_get_info() would
> recursively acquire bus->lock during device registration.
>
> This change depends on "i3c: master: Fix recursive locking during device
> registration", which moves device registration out from under bus->lock
> and removes the possibility of that deadlock. Without that change,
> restoring the i3c_device_get_info() call would reintroduce the deadlock.
>
> Fixes: 6cf7b65f7029 ("i3c: Use i3cdev->desc->info instead of calling i3c_device_get_info() to avoid deadlock")
> Cc: stable at vger.kernel.org # requires "i3c: master: Fix recursive locking during device registration"
> Signed-off-by: Adrian Hunter <adrian.hunter at intel.com>
> Acked-by: Mukesh Savaliya <mukesh.savaliya at oss.qualcomm.com>
> ---
Reviewed-by: Frank Li <Frank.Li at nxp.com>
>
>
> Changes in V4:
>
> Added Mukesh's Acked-by tag
>
> Changes in V3:
>
> New patch
>
>
> drivers/i3c/master.c | 3 +--
> 1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c
> index 2357874bb9d6..ee771ac0b203 100644
> --- a/drivers/i3c/master.c
> +++ b/drivers/i3c/master.c
> @@ -316,8 +316,7 @@ static int i3c_device_uevent(const struct device *dev, struct kobj_uevent_env *e
> struct i3c_device_info devinfo;
> u16 manuf, part, ext;
>
> - if (i3cdev->desc)
> - devinfo = i3cdev->desc->info;
> + i3c_device_get_info(i3cdev, &devinfo);
> manuf = I3C_PID_MANUF_ID(devinfo.pid);
> part = I3C_PID_PART_ID(devinfo.pid);
> ext = I3C_PID_EXTRA_INFO(devinfo.pid);
> --
> 2.53.0
>
More information about the linux-i3c
mailing list