From: Adrian Hunter <adrian.hunter@intel.com>
To: <sashiko-reviews@lists.linux.dev>
Cc: <linux-i3c@lists.infradead.org>,
Alexandre Belloni <alexandre.belloni@bootlin.com>,
<Frank.Li@kernel.org>, <linux-pci@vger.kernel.org>
Subject: Re: [PATCH V3 02/14] i3c: Fix unlocked dereference of dev->desc in i3c_device_get_supported_xfer_mode()
Date: Tue, 4 Aug 2026 18:38:04 +0300 [thread overview]
Message-ID: <bd6a9e30-7536-47cb-aa71-b160ffbf3ccf@intel.com> (raw)
In-Reply-To: <20260804150922.01A091F000E9@smtp.kernel.org>
On 04/08/2026 18:09, sashiko-bot@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
>
> New issues:
> - [Critical] The patch transforms a predictable NULL pointer dereference into an exploitable Use-After-Free of `master->this` when an I3C device outlives its master controller's unregistration.
No. 'desc' is never NULL however it could be being changed concurrently
prior to being freed. UAF of 'desc' is no different to UAF of master->this
(which is anyway being addressed by a different patch
"i3c: master: Fix use-after-free of master->this"),
so nothing "transforms" here.
>
> Pre-existing issues:
> - [High] Uninitialized stack memory (`devinfo`) is used for driver matching when `i3cdev->desc` is NULL.
> - [High] A Time-of-Check to Time-of-Use (TOCTOU) race condition exists when accessing `i3cdev->desc->boardinfo`, leading to a Use-After-Free or NULL pointer dereference.
> --
>
> --- Patch [2]: [PATCH V3 02/14] i3c: Fix unlocked dereference of dev->desc in i3c_device_get_supported_xfer_mode() ---
> commit 97cfccca08da732124561cbc1aa49b571a84dd8c
> Author: Adrian Hunter <adrian.hunter@intel.com>
>
> i3c: Fix unlocked dereference of dev->desc in i3c_device_get_supported_xfer_mode()
>
> This patch modifies i3c_device_get_supported_xfer_mode() to use dev->bus
> instead of dev->desc to obtain the master controller. This avoids a potential
> unlocked dereference of dev->desc.
>
>> diff --git a/drivers/i3c/device.c b/drivers/i3c/device.c
>> index 101eaa77de686..a3778282e84c2 100644
>> --- a/drivers/i3c/device.c
>> +++ b/drivers/i3c/device.c
>> @@ -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);
>
> [Severity: Critical]
> Does this change introduce a use-after-free if the device outlives the master
> controller?
>
> When a master is unregistered, i3c_master_unregister() calls
> i3c_master_unregister_i3c_devs() to unregister child devices. If a child
> device has an elevated refcount (e.g., from an open file descriptor), its
> struct i3c_device outlives the unregistration.
>
> i3c_master_bus_cleanup() then calls i3c_master_detach_free_devs(), which
> explicitly frees master->this.
>
> If the child device later calls i3c_device_get_supported_xfer_mode(), it
> would dereference the explicitly freed master->this pointer. The previous
> code safely faulted on a NULL dev->desc, but this new path appears to access
> freed memory.
>
> [ ... ]
>
> [Severity: High]
> This is a pre-existing issue, but does i3c_device_match() have a TOCTOU race
> condition leading to a use-after-free?
>
> drivers/i3c/master.c:i3c_device_match() {
> if (i3cdev->desc && i3cdev->desc->boardinfo)
> static_addr_method = i3cdev->desc->boardinfo->static_addr_method;
> }
>
> If i3c_device_match() accesses i3cdev->desc without holding the device lock
> during concurrent master unregistration, a context switch could occur right
> after i3cdev->desc is checked.
>
> If the unregistration thread then frees the descriptor via kfree() in
> i3c_master_bus_cleanup(), the subsequent evaluation of
> i3cdev->desc->boardinfo will dereference a freed pointer.
>
> [Severity: High]
> This isn't a bug introduced by this patch, but can i3c_device_match_id()
> evaluate uninitialized stack memory?
>
> During concurrent driver registration and master unregistration, if
> i3c_master_unregister_i3c_devs() sets i3cdev->dev->desc = NULL,
> i3c_device_match() might still proceed to call i3c_device_match_id().
>
> drivers/i3c/device.c:i3c_device_match_id() {
> struct i3c_device_info devinfo;
> ...
> i3c_device_get_info(i3cdev, &devinfo);
>
> manuf = I3C_PID_MANUF_ID(devinfo.pid);
> }
>
> If i3cdev->desc is NULL, i3c_device_get_info() bails out safely without
> populating devinfo, leaving the stack memory completely uninitialized when
> it is subsequently read for driver matching.
>
next prev parent reply other threads:[~2026-08-04 15:38 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-04 13:37 [PATCH V3 00/14] i3c: Support IBI-based system wakeup Adrian Hunter
2026-08-04 13:37 ` [PATCH V3 01/14] i3c: master: Fix recursive locking during device registration Adrian Hunter
2026-08-04 14:51 ` sashiko-bot
2026-08-04 16:46 ` Frank Li
2026-08-04 16:50 ` Adrian Hunter
2026-08-04 22:10 ` Frank Li
2026-08-04 13:37 ` [PATCH V3 02/14] i3c: Fix unlocked dereference of dev->desc in i3c_device_get_supported_xfer_mode() Adrian Hunter
2026-08-04 15:09 ` sashiko-bot
2026-08-04 15:38 ` Adrian Hunter [this message]
2026-08-04 13:37 ` [PATCH V3 03/14] i3c: master: Do not treat master device as a duplicate target Adrian Hunter
2026-08-04 14:17 ` sashiko-bot
2026-08-04 16:50 ` Frank Li
2026-08-04 17:33 ` Mukesh Savaliya
2026-08-04 13:38 ` [PATCH V3 04/14] i3c: master: Fix use-after-free of master->this Adrian Hunter
2026-08-04 14:10 ` sashiko-bot
2026-08-04 15:50 ` Adrian Hunter
2026-08-04 13:38 ` [PATCH V3 05/14] i3c: Make dev->desc locking assumptions explicit Adrian Hunter
2026-08-04 14:18 ` sashiko-bot
2026-08-04 18:08 ` Mukesh Savaliya
2026-08-04 13:38 ` [PATCH V3 06/14] i3c: master: Fix potential UAF in i3c_device_uevent() Adrian Hunter
2026-08-04 15:08 ` sashiko-bot
2026-08-04 18:12 ` Mukesh Savaliya
2026-08-04 13:38 ` [PATCH V3 07/14] i3c: master: Fix potential UAF in i3c_device_match() Adrian Hunter
2026-08-04 15:11 ` sashiko-bot
2026-08-04 17:14 ` Adrian Hunter
2026-08-04 13:38 ` [PATCH V3 08/14] i3c: master: Support IBI-based wakeup capability Adrian Hunter
2026-08-04 14:05 ` sashiko-bot
2026-08-04 18:21 ` Mukesh Savaliya
2026-08-04 13:38 ` [PATCH V3 09/14] i3c: master: Report wakeup events for IBIs Adrian Hunter
2026-08-04 15:10 ` sashiko-bot
2026-08-04 16:12 ` Adrian Hunter
2026-08-04 13:38 ` [PATCH V3 10/14] i3c: master: Add helper to query bus wakeup requirements Adrian Hunter
2026-08-04 13:53 ` sashiko-bot
2026-08-04 18:52 ` Mukesh Savaliya
2026-08-04 13:38 ` [PATCH V3 11/14] i3c: master: Reject IBI requests from non-IBI-capable devices Adrian Hunter
2026-08-04 14:28 ` sashiko-bot
2026-08-04 13:38 ` [PATCH V3 12/14] i3c: mipi-i3c-hci-pci: Propagate I3C wakeup requirements to PCI Adrian Hunter
2026-08-04 15:05 ` sashiko-bot
2026-08-04 13:38 ` [PATCH V3 13/14] i3c: mipi-i3c-hci: Factor out i3c_hci_sysdev() Adrian Hunter
2026-08-04 14:40 ` sashiko-bot
2026-08-04 19:28 ` Mukesh Savaliya
2026-08-04 13:38 ` [PATCH V3 14/14] i3c: mipi-i3c-hci: Advertise IBI wakeup capability Adrian Hunter
2026-08-04 14:45 ` sashiko-bot
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=bd6a9e30-7536-47cb-aa71-b160ffbf3ccf@intel.com \
--to=adrian.hunter@intel.com \
--cc=Frank.Li@kernel.org \
--cc=alexandre.belloni@bootlin.com \
--cc=linux-i3c@lists.infradead.org \
--cc=linux-pci@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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