mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-30 14:33:24 -04:00
i3c: Fix unlocked dereference of dev->desc in i3c_device_get_supported_xfer_mode()
i3c_device_get_supported_xfer_mode() uses dev->desc to obtain the
master controller. However, dev->desc must not be dereferenced unless
bus->lock is held, and this function does not take that lock.
The function only needs access to the master controller associated with
the device's bus. Use dev->bus instead, which is always valid for the
lifetime of the device and does not require dereferencing dev->desc.
Fixes: 256a21743d ("i3c: Add HDR API support")
Cc: stable@vger.kernel.org
Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260807145638.168865-3-adrian.hunter@intel.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
This commit is contained in:
committed by
Alexandre Belloni
parent
456f832e5f
commit
8bed7f4fa7
@@ -309,7 +309,7 @@ EXPORT_SYMBOL_GPL(i3c_device_match_id);
|
||||
*/
|
||||
u32 i3c_device_get_supported_xfer_mode(struct i3c_device *dev)
|
||||
{
|
||||
return i3c_dev_get_master(dev->desc)->this->info.hdr_cap | BIT(I3C_SDR);
|
||||
return i3c_bus_to_i3c_master(dev->bus)->this->info.hdr_cap | BIT(I3C_SDR);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(i3c_device_get_supported_xfer_mode);
|
||||
|
||||
|
||||
@@ -72,4 +72,9 @@ static inline void i3c_readl_fifo(const void __iomem *addr, void *buf,
|
||||
}
|
||||
}
|
||||
|
||||
static inline struct i3c_master_controller *i3c_bus_to_i3c_master(struct i3c_bus *i3cbus)
|
||||
{
|
||||
return container_of(i3cbus, struct i3c_master_controller, bus);
|
||||
}
|
||||
|
||||
#endif /* I3C_INTERNAL_H */
|
||||
|
||||
@@ -102,12 +102,6 @@ void i3c_bus_normaluse_unlock(struct i3c_bus *bus)
|
||||
up_read(&bus->lock);
|
||||
}
|
||||
|
||||
static struct i3c_master_controller *
|
||||
i3c_bus_to_i3c_master(struct i3c_bus *i3cbus)
|
||||
{
|
||||
return container_of(i3cbus, struct i3c_master_controller, bus);
|
||||
}
|
||||
|
||||
static struct i3c_master_controller *dev_to_i3cmaster(struct device *dev)
|
||||
{
|
||||
return container_of(dev, struct i3c_master_controller, dev);
|
||||
|
||||
Reference in New Issue
Block a user