All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Christian Marangi" <ansuelsmth@gmail.com>
Cc: conor+dt@kernel.org, robh@kernel.org, devicetree@vger.kernel.org
Subject: Re: [PATCH net-next v11 06/12] net: phylink: support late PCS provider attach
Date: Sat, 08 Aug 2026 13:13:53 +0000	[thread overview]
Message-ID: <20260808131354.3C1311F00A3A@smtp.kernel.org> (raw)
In-Reply-To: <20260807131301.192060-7-ansuelsmth@gmail.com>

Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [Critical] Self-deadlock in fwnode_pcs_del_provider via FWNODE_PCS_PROVIDER_DEL notification.
- [High] Error paths in phylink_create skip necessary cleanup, leading to Use-After-Free of the phylink instance and dangling PCS pointers.
- [High] phylink_del_pcs unconditionally calls list_del, crashing on PCS structures not tracked in the phylink list.
- [High] Missing reference counting on struct phylink_pcs pointers allows a TOCTOU Use-After-Free during asynchronous provider removal.
--

--- Patch [6]: [PATCH net-next v11 06/12] net: phylink: support late PCS provider attach ---
commit d404b5bc48ec98384e8bad4f7b0b1af967121eee
Author: Christian Marangi <ansuelsmth@gmail.com>

net: phylink: support late PCS provider attach

This patch adds support for attaching a PCS provider to a phylink instance
after the instance has been created and started. It introduces
FWNODE_PCS_PROVIDER_ADD to notify phylink when a new PCS provider becomes
available, linking it and triggering a resolve step to recover links.

> diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
> index 548e783ae2aaa..69d4f6675db0f 100644
> --- a/drivers/net/phy/phylink.c
> +++ b/drivers/net/phy/phylink.c
[ ... ]
> @@ -1939,7 +1960,7 @@ static int phylink_fill_available_pcs(struct phylink *pl,
>  		if (!pcs)
>  			continue;
>  
> -		list_add_tail(&pcs->list, &pl->pcs_list);
> +		phylink_add_pcs(pl, pcs);

[Severity: High]
Could the lack of reference counting on the returned phylink_pcs pointers
lead to a use-after-free here?

fwnode_pcs_get() and its underlying provider callbacks return a pointer
without taking a reference. If a concurrent provider unbind occurs right
before pl->state_mutex is acquired, the provider could be removed and the
memory freed.

When the lock is finally acquired in phylink_fill_available_pcs(), could
this add a freed pointer to the list?

>  	}
>  
>  	mutex_unlock(&pl->state_mutex);
> @@ -1991,7 +2012,19 @@ static int pcs_provider_notify(struct notifier_block *self,
>  
>  	mutex_lock(&pl->state_mutex);
>  
> -	phylink_del_pcs(pl, pcs);
> +	switch (val) {
> +	case FWNODE_PCS_PROVIDER_ADD:
> +		phylink_add_pcs(pl, pcs);
> +
> +		/* Force an interface reconfig if major config fail */
> +		if (pl->major_config_failed)
> +			pl->force_major_config = true;
> +
> +		break;
> +	case FWNODE_PCS_PROVIDER_DEL:
> +		phylink_del_pcs(pl, pcs);

[Severity: High]
Will this cause a crash if the PCS being removed was never actually added to
the list?

When handling a provider removal, phylink_del_pcs() is called
unconditionally based purely on its presence in the device tree. If the
driver's fill_available_pcs() omitted it, or if phylink_create() failed
before it could be added, the pcs->list remains uninitialized.

Would this lead to list_del(&pcs->list) dereferencing a NULL pointer?

[Severity: Critical]
Could this notifier chain lead to a self-deadlock when removing a provider?

When fwnode_pcs_del_provider() is called, it acquires fwnode_pcs_mutex and
fires the FWNODE_PCS_PROVIDER_DEL notification.

This notifier callback, pcs_provider_notify(), responds by calling
fwnode_phylink_pcs_get_from_fwnode():

pcs_provider_notify()
   pcs = fwnode_phylink_pcs_get_from_fwnode(pl_fwnode, pcs_fwnode);

This subsequently calls fwnode_pcs_get_from_pcsspec(), which attempts to
acquire the exact same fwnode_pcs_mutex lock.

Since the lock is not recursive, will this result in a deadlock on the
thread removing the provider?

> +		break;
> +	}
>  
>  	/* Refresh supported interfaces */
>  	phy_interface_copy(pl->supported_interfaces,
> @@ -2077,10 +2110,6 @@ struct phylink *phylink_create(struct phylink_config *config,
>  
>  	mutex_lock(&pl->state_mutex);
>  
> -	/* Link available PCS to phylink */
> -	list_for_each_entry(pcs, &pl->pcs_list, list)
> -		pcs->phylink = pl;
> -

[Severity: High]
Does the error handling in phylink_create() leak dangling pointers and use
freed memory if a failure occurs after the notifier is registered?

The PCS notifier is registered early in phylink_create(). If an asynchronous
FWNODE_PCS_PROVIDER_ADD event fires concurrently, pcs_provider_notify()
can queue the pl->resolve work item.

If phylink_create() subsequently fails (for example, in
phylink_fill_available_pcs()), the error path jumps to unregister_pcs_notify
and frees the phylink structure:

unregister_pcs_notify:
    unregister_fwnode_pcs_notifier(&pl->fwnode_pcs_nb);
free_pl:
    kfree(pl);

This path does not call cancel_work_sync(&pl->resolve), leaving the queued
work to execute on freed memory.

Additionally, because the error path skips unlinking the PCS list, any PCS
dynamically added by the notifier will be left with a dangling pcs->phylink
pointer.

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260807131301.192060-1-ansuelsmth@gmail.com?part=6

  reply	other threads:[~2026-08-08 13:13 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-07 13:12 [PATCH net-next v11 00/12] net: pcs: Introduce support for fwnode PCS Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 01/12] net: phylink: keep and use MAC supported_interfaces in phylink struct Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 02/12] net: phylink: introduce internal phylink PCS handling Christian Marangi
2026-08-08 13:13   ` sashiko-bot
2026-08-09 17:25   ` Andrew Lunn
2026-08-07 13:12 ` [PATCH net-next v11 03/12] net: pcs: implement Firmware node support for PCS driver Christian Marangi
2026-08-07 20:29   ` Randy Dunlap
2026-08-07 20:49     ` Christian Marangi
2026-08-08 13:13   ` sashiko-bot
2026-08-07 13:12 ` [PATCH net-next v11 04/12] net: phylink: save phylink instance fwnode on phylink_create Christian Marangi
2026-08-08 13:13   ` sashiko-bot
2026-08-09 17:29   ` Andrew Lunn
2026-08-07 13:12 ` [PATCH net-next v11 05/12] net: phylink: support PCS provider release Christian Marangi
2026-08-08 13:13   ` sashiko-bot
2026-08-07 13:12 ` [PATCH net-next v11 06/12] net: phylink: support late PCS provider attach Christian Marangi
2026-08-08 13:13   ` sashiko-bot [this message]
2026-08-09 17:35   ` Andrew Lunn
2026-08-07 13:12 ` [PATCH net-next v11 07/12] net: Document PCS subsystem Christian Marangi
2026-08-08 13:13   ` sashiko-bot
2026-08-07 13:12 ` [PATCH net-next v11 08/12] MAINTAINERS: add myself as PCS subsystem maintainer Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 09/12] net: phylink: add .pcs_link_down PCS OP Christian Marangi
2026-08-08 13:13   ` sashiko-bot
2026-08-07 13:12 ` [PATCH net-next v11 10/12] dt-bindings: net: pcs: Document support for Airoha Ethernet PCS Christian Marangi
2026-08-08 13:13   ` sashiko-bot
2026-08-07 13:12 ` [PATCH net-next v11 11/12] net: pcs: airoha: add PCS driver for Airoha AN7581 SoC Christian Marangi
2026-08-08 13:13   ` sashiko-bot
2026-08-07 13:12 ` [PATCH net-next v11 12/12] net: airoha: add phylink support Christian Marangi
2026-08-08 13:13   ` sashiko-bot
2026-08-09 17:44 ` [PATCH net-next v11 00/12] net: pcs: Introduce support for fwnode PCS Andrew Lunn
2026-08-09 17:49   ` Christian Marangi
2026-08-09 20:43     ` Andrew Lunn
2026-08-09 20:59       ` Christian Marangi

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=20260808131354.3C1311F00A3A@smtp.kernel.org \
    --to=sashiko-bot@kernel.org \
    --cc=ansuelsmth@gmail.com \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=robh@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 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.