All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Chen-Yu Tsai" <wenst@chromium.org>
Cc: robh@kernel.org, devicetree@vger.kernel.org, conor+dt@kernel.org
Subject: Re: [PATCH v5 10/16] usb: hub: Power on connected M.2 E-key connectors with power sequencing API
Date: Wed, 15 Jul 2026 09:28:13 +0000	[thread overview]
Message-ID: <20260715092814.21C6C1F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260715085348.3457359-11-wenst@chromium.org>

Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [High] Concurrent sysfs `disable` read or write can dereference an `ERR_PTR` if `usb_hub_port_pwrseq_get()` fails.
- [High] usb_hub_set_port_power() accesses the dynamically allocated hub->ports array, which can be freed concurrently by hub_disconnect().
--

--- Patch [10]: [PATCH v5 10/16] usb: hub: Power on connected M.2 E-key connectors with power sequencing API ---
commit e0346a1be7fb5d1254f3498bb6d857dd5db5a9d7
Author: Chen-Yu Tsai <wenst@chromium.org>
Subject: usb: hub: Power on connected M.2 E-key connectors with power sequencing API

This patch integrates the power sequencing API with USB ports to support M.2
E-key connectors. It manages power sequencing during port creation, removal,
and power state changes.

> diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
> index 10f15b40fcc55..298fb68c6afc7 100644
> --- a/drivers/usb/core/hub.c
> +++ b/drivers/usb/core/hub.c

[ ... ]

> @@ -887,15 +898,22 @@ int usb_hub_set_port_power(struct usb_device *hdev, struct usb_hub *hub,
>  			   int port1, bool set)
>  {
> +	struct usb_port *pwrseq_port = hub->ports[port1 - 1];

[Severity: High]
Can this code trigger a use-after-free on the hub->ports array?

The sysfs disable_store callback uses sysfs_break_active_protection()
to avoid deadlocks, meaning it prevents device_unregister() from waiting
for the callback to finish.

If hub_probe() fails and triggers hub_disconnect() concurrently,
hub_disconnect() will call device_unregister() which returns immediately.
Then hub_disconnect() unconditionally frees the hub->ports array:

hub_disconnect() {
    ...
    kfree(hub->ports);
}

Meanwhile, disable_store() can continue and call usb_hub_set_port_power(),
which now accesses the freed hub->ports array. Prior to this change,
usb_hub_set_port_power() only accessed inline fields of the refcounted
hub struct.

Is there a way to safely access the port here without racing against the array
being freed?

> +	int ret;
>  
> +	ret = usb_hub_set_port_pwrseq(pwrseq_port, set);
> +	if (ret)
> +		return ret;

[ ... ]

> diff --git a/drivers/usb/core/port.c b/drivers/usb/core/port.c
> index 19913ad3598b3..430fc90232502 100644
> --- a/drivers/usb/core/port.c
> +++ b/drivers/usb/core/port.c

[ ... ]

> @@ -831,6 +879,13 @@ int usb_hub_create_port_device(struct usb_hub *hub, int port1)
>  		goto err_put_kn;
>  	}
>  
> +	port_dev->pwrseq = usb_hub_port_pwrseq_get(port_dev);
> +	if (IS_ERR(port_dev->pwrseq)) {
> +		retval = dev_err_probe(&port_dev->dev, PTR_ERR(port_dev->pwrseq),
> +				       "failed to get power sequencing descriptor\n");
> +		goto err_put_kn;
> +	}

[Severity: High]
Could this temporarily expose an ERR_PTR to concurrent sysfs operations?

The port device is registered earlier in this function via device_register(),
exposing its sysfs attributes (like disable) before usb_hub_port_pwrseq_get()
is called.

If acquiring the power sequencer fails and returns an ERR_PTR,
port_dev->pwrseq will hold this ERR_PTR. Because sysfs unregistration waits
for active callbacks on the error path, a concurrent read or write to the
disable attribute could access port_dev->pwrseq while it holds an error value.

This ERR_PTR would then be passed to usb_port_is_power_on() or
usb_hub_set_port_pwrseq(), which call the power sequencer APIs:

static int usb_hub_set_port_pwrseq(struct usb_port *port, bool on)
{
    if (!IS_ENABLED(CONFIG_POWER_SEQUENCING))
        return 0;
        
    if (on)
        return pwrseq_power_on(port->pwrseq);
    return pwrseq_power_off(port->pwrseq);
}

Since the pwrseq_power_* APIs do not check for ERR_PTR, would this cause
a panic when dereferencing the pointer?

> +
>  	retval = component_add(&port_dev->dev, &connector_ops);
>  	if (retval) {
>  		dev_warn(&port_dev->dev, "failed to add component\n");

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260715085348.3457359-1-wenst@chromium.org?part=10

  reply	other threads:[~2026-07-15  9:28 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-15  8:53 [PATCH v5 00/16] arm64: mediatek: Add M.2 E-key slot on Chromebooks Chen-Yu Tsai
2026-07-15  8:53 ` [PATCH v5 01/16] device property: Add fwnode_graph_get_port_by_id() Chen-Yu Tsai
2026-07-15  9:03   ` sashiko-bot
2026-07-15  8:53 ` [PATCH v5 02/16] device property: Add fwnode_graph_get_next_port_endpoint() Chen-Yu Tsai
2026-07-15  9:09   ` sashiko-bot
2026-07-15  8:53 ` [PATCH v5 03/16] power: sequencing: Add pwrseq_power_is_on() Chen-Yu Tsai
2026-07-15  9:08   ` sashiko-bot
2026-07-15  9:29   ` Andy Shevchenko
2026-07-15 12:10     ` Bartosz Golaszewski
2026-07-15  8:53 ` [PATCH v5 04/16] usb: hub: Use assign_bit() in usb_hub_set_port_power() Chen-Yu Tsai
2026-07-15  9:11   ` Andy Shevchenko
2026-07-15  8:53 ` [PATCH v5 05/16] usb: hub: Return actual error from hub_configure() in hub_probe() Chen-Yu Tsai
2026-07-15  8:53 ` [PATCH v5 06/16] usb: hub: Associate port@ fwnode with USB port device Chen-Yu Tsai
2026-07-15  9:20   ` Andy Shevchenko
2026-07-15  8:53 ` [PATCH v5 07/16] usb: core: Move struct usb_port and related APIs to port.h Chen-Yu Tsai
2026-07-15  9:31   ` Andy Shevchenko
2026-07-15  8:53 ` [PATCH v5 08/16] usb: hub: Pass |struct usb_port*| to usb_port_is_power_on() Chen-Yu Tsai
2026-07-15  8:53 ` [PATCH v5 09/16] usb: hub: Use usb_hub_set_port_power() to control port power everywhere Chen-Yu Tsai
2026-07-15  8:53 ` [PATCH v5 10/16] usb: hub: Power on connected M.2 E-key connectors with power sequencing API Chen-Yu Tsai
2026-07-15  9:28   ` sashiko-bot [this message]
2026-07-15 13:25   ` Andy Shevchenko
2026-07-15  8:53 ` [PATCH v5 11/16] dt-bindings: usb: mediatek,mtk-xhci: Switch to ports for USB connections Chen-Yu Tsai
2026-07-15  8:53 ` [PATCH v5 12/16] power: sequencing: pcie-m2: support matching on remote "port" node Chen-Yu Tsai
2026-07-15  9:29   ` sashiko-bot
2026-07-15  8:53 ` [PATCH v5 13/16] power: sequencing: pcie-m2: Add usb and sdio targets for E-key connector Chen-Yu Tsai
2026-07-15  9:34   ` sashiko-bot
2026-07-15  8:53 ` [PATCH v5 14/16] power: sequencing: pcie-m2: Split Bluetooth unit based on interface Chen-Yu Tsai
2026-07-15  9:34   ` sashiko-bot
2026-07-15  8:53 ` [PATCH v5 15/16] arm64: dts: mediatek: mt8195-cherry: Add M.2 E-key slot Chen-Yu Tsai
2026-07-15  9:45   ` sashiko-bot
2026-07-15  8:53 ` [PATCH v5 16/16] arm64: dts: mediatek: mt8188-geralt: Add WiFi/BT as " Chen-Yu Tsai

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=20260715092814.21C6C1F00A3A@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=wenst@chromium.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.