All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Chen-Yu Tsai" <wenst@chromium.org>
Cc: devicetree@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org
Subject: Re: [PATCH v5 02/16] device property: Add fwnode_graph_get_next_port_endpoint()
Date: Wed, 15 Jul 2026 09:09:43 +0000	[thread overview]
Message-ID: <20260715090944.2B4441F000E9@smtp.kernel.org> (raw)
In-Reply-To: <20260715085348.3457359-3-wenst@chromium.org>

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

New issues:
- [High] The new `fwnode_graph_get_next_port_endpoint()` helper breaks the `fwnode` graph abstraction by hardcoding OF-specific naming conventions, which will silently ignore valid ACPI and software node endpoints.
- [Medium] `fwnode_graph_get_next_port_endpoint()` fails to unconditionally put the `prev` fwnode reference if an invalid `port` is provided, violating its documented API contract.

Pre-existing issues:
- [High] This problem wasn't introduced by this patch, but iterating over endpoints using `fwnode_get_next_child_node()` causes an infinite loop and Use-After-Free when a device has secondary fwnodes attached.
--

--- Patch [2]: [PATCH v5 02/16] device property: Add fwnode_graph_get_next_port_endpoint() ---
commit 8a16a51eeb8e99439d5b85ce61789ff1153e9060
Author: Chen-Yu Tsai <wenst@chromium.org>

device property: Add fwnode_graph_get_next_port_endpoint()

Adds a helper function to iterate through the endpoint firmware nodes
under a given port. This is intended to be used in USB power sequencing
integration to verify graph connections and supported connector types.

> diff --git a/drivers/base/property.c b/drivers/base/property.c
> index 0bd45f8b01c14..62c6221d65d05 100644
> --- a/drivers/base/property.c
> +++ b/drivers/base/property.c

[ ... ]

> @@ -1099,6 +1099,31 @@ int fwnode_irq_get_byname(const struct fwnode_handle *fwnode, const char *name)
>  }
>  EXPORT_SYMBOL(fwnode_irq_get_byname);
>  
> +/**
> + * fwnode_graph_get_next_port_endpoint - Get next endpoint firmware node in port
> + * @port: Pointer to the target port firmware node
> + * @prev: Previous endpoint node or %NULL to get the first
> + *
> + * The caller is responsible for calling fwnode_handle_put() on the returned
> + * fwnode pointer. Note that this function also puts a reference to @prev
> + * unconditionally.
> + *
> + * Return: an endpoint firmware node pointer or %NULL if no more endpoints
> + * are available.
> + */
> +struct fwnode_handle *fwnode_graph_get_next_port_endpoint(const struct fwnode_handle *port,
> +							  struct fwnode_handle *prev)
> +{
> +	do {
> +		prev = fwnode_get_next_child_node(port, prev);

[Severity: High]
This is a pre-existing issue, but iterating over endpoints using
fwnode_get_next_child_node() can cause an infinite loop and a use-after-free
if a device has secondary fwnodes attached.

If a device port has both primary children and a secondary fwnode, the primary
ops finish and drop the reference to the last primary child, returning NULL.
Then, fwnode_get_next_child_node() incorrectly passes this same dropped child
pointer to the secondary ops:

drivers/base/property.c:fwnode_get_next_child_node() {
	/* Try to find a child in primary fwnode */
	next = fwnode_call_ptr_op(fwnode, get_next_child_node, child);
	if (next)
		return next;

	/* When no more children in primary, continue with secondary */
	return fwnode_call_ptr_op(fwnode->secondary, get_next_child_node, child);
}

This can result in a double-put. Furthermore, when traversing secondary
children, the primary ops don't recognize the software node, treat it as NULL,
and return the first primary child again, creating an infinite loop.

[Severity: Medium]
Does this fail to unconditionally put the prev reference if the provided port
is invalid?

If a caller passes a valid prev node but port is NULL or an error pointer,
fwnode_get_next_child_node() returns early without dropping prev:

drivers/base/property.c:fwnode_get_next_child_node() {
	struct fwnode_handle *next;

	if (IS_ERR_OR_NULL(fwnode))
		return NULL;
    ...
}

Could this lead to a reference count leak, violating the documented API
contract that prev is unconditionally put?

> +		if (fwnode_name_eq(prev, "endpoint"))

[Severity: High]
Does hardcoding this string match break the fwnode graph abstraction for
non-DeviceTree platforms?

By strictly matching the "endpoint" prefix, this bypasses the provider-specific
fwnode_operations, which could silently ignore valid ACPI and software node
endpoints that don't follow this exact naming scheme. Shouldn't this rely on
the backend-specific graph_get_next_endpoint operations instead?

> +			break;
> +	} while (prev);
> +
> +	return prev;
> +}
> +EXPORT_SYMBOL_GPL(fwnode_graph_get_next_port_endpoint);

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

  reply	other threads:[~2026-07-15  9:09 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 [this message]
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
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=20260715090944.2B4441F000E9@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.