[PATCH V3 16/17] i3c: Restrict HDR modes to those supported by the bus and target
sashiko-bot at kernel.org
sashiko-bot at kernel.org
Sun Sep 20 08:33:59 PDT 2026
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [High] i3c: missing NULL check for dev->desc in i3c_device_get_supported_xfer_mode
--
commit 62529bd655d4c18d69da34f93d179ce363aba85c
Author: Adrian Hunter <adrian.hunter at intel.com>
i3c: Restrict HDR modes to those supported by the bus and target
This commit refactors i3c_device_get_supported_xfer_mode() to consider HDR
modes allowed by the controller, bus configuration, and target. It
introduces a helper i3c_dev_supported_xfer_modes_locked() and adds bus
locking in normal use mode to access the device descriptor safely.
> diff --git a/drivers/i3c/device.c b/drivers/i3c/device.c
> index f1ba363b22a17..4df4682af1504 100644
> --- a/drivers/i3c/device.c
> +++ b/drivers/i3c/device.c
[ ... ]
> @@ -301,16 +301,23 @@ i3c_device_match_id(struct i3c_device *i3cdev,
> EXPORT_SYMBOL_GPL(i3c_device_match_id);
>
> /**
> - * i3c_device_get_supported_xfer_mode - Returns the supported transfer mode by
> - * connected master controller.
> + * i3c_device_get_supported_xfer_mode - Returns the transfer modes supported by
> + * the connected master controller and @dev,
> + * and allowed by the bus configuration.
> * @dev: I3C device
> *
> * Return: a bit mask, which supported transfer mode, bit position is defined at
> - * enum i3c_hdr_mode
> + * enum i3c_xfer_mode
> */
> u32 i3c_device_get_supported_xfer_mode(struct i3c_device *dev)
> {
> - return i3c_bus_to_i3c_master(dev->bus)->this->info.hdr_cap | BIT(I3C_SDR);
> + u32 modes;
> +
> + i3c_bus_normaluse_lock(dev->bus);
> + modes = i3c_dev_supported_xfer_modes_locked(dev->desc);
[Severity: High]
Does this code risk a NULL pointer dereference during device unregistration?
If a device is being concurrently unregistered,
i3c_master_unregister_i3c_devs() asynchronously sets dev->desc = NULL
before driver unbinding completes. Other APIs in the I3C subsystem (such
as i3c_device_get_info() and i3c_device_disable_ibi()) appear to guard
against this teardown race condition by explicitly checking if (dev->desc)
inside the bus lock.
Without a prior NULL check here, dev->desc is passed into
i3c_dev_supported_xfer_modes_locked(), which unconditionally dereferences
it:
include/linux/i3c/master.h:i3c_dev_get_master() {
return dev->common.master;
}
drivers/i3c/master.c:i3c_dev_supported_xfer_modes_locked() {
struct i3c_master_controller *master = i3c_dev_get_master(dev);
...
}
Could a check for dev->desc be added inside the lock before calling the
helper?
> + i3c_bus_normaluse_unlock(dev->bus);
> +
> + return modes;
> }
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260920151248.46936-1-adrian.hunter@intel.com?part=16
More information about the linux-i3c
mailing list