All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Sven Peter" <sven@kernel.org>
Cc: conor+dt@kernel.org, devicetree@vger.kernel.org, robh@kernel.org
Subject: Re: [PATCH v2 02/22] usb: typec: Represent USB4 on the Type-C bus
Date: Sun, 06 Sep 2026 18:52:59 +0000	[thread overview]
Message-ID: <20260906185300.45B441F00A3D@smtp.kernel.org> (raw)
In-Reply-To: <20260906-b4-apple-soc-tbt-v2-2-1f80085f93fb@kernel.org>

Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:

New issues:
- [High] TOCTOU race introduced by double-read of `altmode->partner` in `typec_altmode_notify()`.

Pre-existing issues:
- [High] Missing NULL check on `partner` leads to a NULL pointer dereference in `typec_altmode_enter()` and `typec_altmode_exit()`.
- [High] Lockless double-read of `adev->dev.driver` in `typec_altmode_update_active()` can race with driver unbinding, causing a NULL pointer dereference.
--

commit 78f546f39cb57c2d6df37d112b4c42115768555d
Author: Sven Peter <sven@kernel.org>

usb: typec: Represent USB4 on the Type-C bus

USB4 technically isn't alternate mode and entered using the EUDO and has
no SVID or Discover Modes Response. We can still represent it like an
altmode on the Type-C bus though by adding a mode kind. Exclude the USB4
modes from any SVID-specific operations and driver binding, but allow
consumers to observe their state through notifications.

> diff --git a/drivers/usb/typec/bus.c b/drivers/usb/typec/bus.c
> index e84b134a33813..8e6d7769fac3f 100644
> --- a/drivers/usb/typec/bus.c
> +++ b/drivers/usb/typec/bus.c
> @@ -93,6 +93,8 @@ int typec_altmode_notify(struct typec_altmode *adev,
>  
>  	if (!adev)
>  		return 0;
> +	if (adev->mode_kind != TYPEC_MODE_KIND_ALTMODE)
> +		return -EOPNOTSUPP;
>  
>  	altmode = to_altmode(adev);
>  

[Severity: High]
Does this code introduce a regression with a TOCTOU race from a double-read of
altmode->partner?

Looking at typec_altmode_notify() in drivers/usb/typec/bus.c:

	if (!altmode->partner)
		return -ENODEV;

	is_port = is_typec_port(adev->dev.parent);
	partner = altmode->partner;

	ret = typec_altmode_set_switches(is_port ? altmode : partner, conf, data);

If typec_altmode_put_partner() sets altmode->partner to NULL concurrently
without holding a lock that serializes against typec_altmode_notify()
(for example, during a device unplug), could a race between these two lines
allow the second read of altmode->partner to be NULL? This could
unconditionally dereference partner->adev.ops later in the function.

[ ... ]
> @@ -125,12 +127,19 @@ EXPORT_SYMBOL_GPL(typec_altmode_notify);
>   */
>  int typec_altmode_enter(struct typec_altmode *adev, u32 *vdo)
>  {
> -	struct altmode *partner = to_altmode(adev)->partner;
> -	struct typec_altmode *pdev = &partner->adev;
> +	struct typec_altmode *pdev;
> +	struct altmode *partner;
>  	int ret;
>  
> -	if (!adev || adev->active)
> +	if (!adev)
>  		return 0;
> +	if (adev->mode_kind != TYPEC_MODE_KIND_ALTMODE)
> +		return -EOPNOTSUPP;
> +	if (adev->active)
> +		return 0;
> +
> +	partner = to_altmode(adev)->partner;
> +	pdev = &partner->adev;
>  
>  	if (!pdev->ops || !pdev->ops->enter)
>  		return -EOPNOTSUPP;

[Severity: High]
This is a pre-existing issue, but can this lead to a NULL pointer dereference
if partner is NULL?

If a partner altmode is registered but there is no matching port altmode
(for example, plugging a Thunderbolt device into a non-TBT Type-C port),
typec_altmode_set_partner() leaves altmode->partner as NULL.

If the Thunderbolt driver binds to this partner altmode and calls
typec_altmode_enter() from its workqueue, it would unconditionally compute
&partner->adev from a NULL partner pointer, and then dereference the invalid
pointer at pdev->ops.

[ ... ]
> @@ -156,13 +165,20 @@ EXPORT_SYMBOL_GPL(typec_altmode_enter);
>   */
>  int typec_altmode_exit(struct typec_altmode *adev)
>  {
> -	struct altmode *partner = to_altmode(adev)->partner;
> -	struct typec_altmode *pdev = &partner->adev;
> +	struct typec_altmode *pdev;
> +	struct altmode *partner;
>  	int ret;
>  
> -	if (!adev || !adev->active)
> +	if (!adev)
> +		return 0;
> +	if (adev->mode_kind != TYPEC_MODE_KIND_ALTMODE)
> +		return -EOPNOTSUPP;
> +	if (!adev->active)
>  		return 0;
>  
> +	partner = to_altmode(adev)->partner;
> +	pdev = &partner->adev;
> +
>  	if (!pdev->ops || !pdev->ops->exit)
>  		return -EOPNOTSUPP;

[Severity: High]
This is a pre-existing issue, but similar to typec_altmode_enter(), can this
cause a crash during altmode exit?

If partner is NULL, pdev = &partner->adev creates an invalid pointer that is
subsequently dereferenced at pdev->ops.

[ ... ]
> diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
> index 5808a3ef0d6cd..869d6857c0dca 100644
> --- a/drivers/usb/typec/class.c
> +++ b/drivers/usb/typec/class.c
> @@ -296,6 +297,8 @@ static void typec_altmode_put_partner(struct altmode *altmode)
>   *
>   * If a partner or cable plug executes Enter/Exit Mode command successfully, the
>   * drivers use this routine to report the updated state of the mode.
> + * For USB4 partner modes, drivers use this routine to report entry through
> + * Enter_USB and exit from USB4.
>   */
>  void typec_altmode_update_active(struct typec_altmode *adev, bool active)
>  {

[Severity: High]
This isn't a bug introduced by this patch, but does the lockless double-read
of adev->dev.driver in typec_altmode_update_active() leave a race condition?

Earlier in this function, the code evaluates adev->dev.driver:

	if (!is_typec_port(adev->dev.parent) && adev->dev.driver) {
		if (!active)
			module_put(adev->dev.driver->owner);
		else
			WARN_ON(!try_module_get(adev->dev.driver->owner));
	}

Because this block only holds alt->state_lock and concurrent driver unbinding
sets dev->driver = NULL under device_lock(), without READ_ONCE() or proper
locking, the compiler can issue two reads for adev->dev.driver. 

If unbinding occurs between the check and accessing adev->dev.driver->owner,
can the second read evaluate to NULL and lead to a crash?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260906-b4-apple-soc-tbt-v2-0-1f80085f93fb@kernel.org?part=2

  reply	other threads:[~2026-09-06 18:53 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-06 18:36 [PATCH v2 00/22] Initial USB4/Thunderbolt support for Apple M1/M2/M3 SoCs Sven Peter
2026-09-06 18:36 ` [PATCH v2 01/22] usb: typec: Add alternate mode state notifiers Sven Peter
2026-09-06 18:48   ` sashiko-bot
2026-09-07 13:27   ` Joshua Peisach
2026-09-08 12:00   ` Heikki Krogerus
2026-09-06 18:36 ` [PATCH v2 02/22] usb: typec: Represent USB4 on the Type-C bus Sven Peter
2026-09-06 18:52   ` sashiko-bot [this message]
2026-09-07 13:31   ` Joshua Peisach
2026-09-08 12:07   ` Heikki Krogerus
2026-09-06 18:36 ` [PATCH v2 03/22] usb: typec: tipd: Register a USB4 port mode for CD321x Sven Peter
2026-09-06 18:47   ` sashiko-bot
2026-09-06 18:36 ` [PATCH v2 04/22] usb: typec: tipd: Publish CD321x partner alternate modes Sven Peter
2026-09-06 18:54   ` sashiko-bot
2026-09-06 18:36 ` [PATCH v2 05/22] dt-bindings: thunderbolt: Add Apple USB4/Thunderbolt NHI Sven Peter
2026-09-17 22:30   ` Rob Herring (Arm)
2026-09-06 18:36 ` [PATCH v2 06/22] dt-bindings: thunderbolt: Add Apple USB4/Thunderbolt ACIO block Sven Peter
2026-09-17 22:33   ` Rob Herring (Arm)
2026-09-06 18:36 ` [PATCH v2 07/22] thunderbolt: Try reading host DROM from device tree first Sven Peter
2026-09-15 17:20   ` Konrad Dybcio
2026-09-06 18:36 ` [PATCH v2 08/22] thunderbolt: Don't read the UID if we already know it Sven Peter
2026-09-06 19:07   ` sashiko-bot
2026-09-06 18:36 ` [PATCH v2 09/22] thunderbolt: Allocate ring HopID before requesting the ring interrupt Sven Peter
2026-09-06 18:36 ` [PATCH v2 10/22] thunderbolt: Unlock host router ports during startup Sven Peter
2026-09-06 19:03   ` sashiko-bot
2026-09-08  8:22   ` Mika Westerberg
2026-09-06 18:36 ` [PATCH v2 11/22] thunderbolt: Find Apple VSE capability " Sven Peter
2026-09-06 18:45   ` sashiko-bot
2026-09-07 13:38   ` Joshua Peisach
2026-09-08 20:24     ` Sven Peter
2026-09-06 18:36 ` [PATCH v2 12/22] thunderbolt: Add ring_interrupt_active to tb_nhi_ops Sven Peter
2026-09-06 18:36 ` [PATCH v2 13/22] thunderbolt: Add ring register accessors " Sven Peter
2026-09-08  8:32   ` Mika Westerberg
2026-09-06 18:36 ` [PATCH v2 14/22] thunderbolt: Add ring_interrupt_mask " Sven Peter
2026-09-06 18:36 ` [PATCH v2 15/22] thunderbolt: Add ring_configure " Sven Peter
2026-09-06 18:53   ` sashiko-bot
2026-09-06 18:36 ` [PATCH v2 16/22] thunderbolt: Add add_links " Sven Peter
2026-09-06 18:55   ` sashiko-bot
2026-09-08  8:35   ` Mika Westerberg
2026-09-06 18:36 ` [PATCH v2 17/22] thunderbolt: Add QUIRK_NO_USB3_BW_ALLOC Sven Peter
2026-09-06 18:36 ` [PATCH v2 18/22] thunderbolt: Export symbols required by the Apple Silicon driver Sven Peter
2026-09-06 18:36 ` [PATCH v2 19/22] thunderbolt: Add Apple Silicon support Sven Peter
2026-09-06 18:59   ` sashiko-bot
2026-09-08  9:18   ` Mika Westerberg
2026-09-08 19:02     ` Sven Peter
2026-09-08 19:04       ` Sven Peter
2026-09-09  6:06       ` Mika Westerberg
2026-09-09 15:20         ` Sven Peter
2026-09-09 15:25           ` Sven Peter
2026-09-10  4:52             ` Mika Westerberg
2026-09-10  4:50           ` Mika Westerberg
2026-09-06 18:36 ` [PATCH v2 20/22] arm64: dts: apple: t8103: Add USB4 ACIO and NHI Sven Peter
2026-09-06 18:36 ` [PATCH v2 21/22] arm64: dts: apple: t8112: " Sven Peter
2026-09-06 18:36 ` [PATCH v2 22/22] arm64: dts: apple: t60xx: " Sven Peter
2026-09-06 18:57   ` sashiko-bot
2026-09-07 13:52 ` [PATCH v2 00/22] Initial USB4/Thunderbolt support for Apple M1/M2/M3 SoCs Joshua Peisach

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=20260906185300.45B441F00A3D@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=robh@kernel.org \
    --cc=sashiko-reviews@lists.linux.dev \
    --cc=sven@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.