All of lore.kernel.org
 help / color / mirror / Atom feed
From: Siddharth Vadapalli <s-vadapalli@ti.com>
To: Simon Horman <horms@kernel.org>
Cc: <andrew+netdev@lunn.ch>, <davem@davemloft.net>,
	<edumazet@google.com>, <kuba@kernel.org>, <pabeni@redhat.com>,
	<c-vankar@ti.com>, <vadim.fedorenko@linux.dev>, <v-singh1@ti.com>,
	<nm@ti.com>, <daniel.zahka@gmail.com>,
	<nora.schiffer@ew.tq-group.com>, <oss@vassilevski.com>,
	<grygorii.strashko@ti.com>, <netdev@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>, <srk@ti.com>,
	<s-vadapalli@ti.com>
Subject: Re: [PATCH net] net: ethernet: ti: am65-cpsw-nuss: Fix port_id extraction from SRC TAG
Date: Tue, 11 Aug 2026 10:38:55 +0530	[thread overview]
Message-ID: <d7841492-7e2a-4f4e-ae82-8058c7f4c6a5@ti.com> (raw)
In-Reply-To: <20260810165629.788002-1-horms@kernel.org>

On 10/08/26 22:26, Simon Horman wrote:
> This is an AI-generated review of your patch. The human sending this
> email has considered the AI review valid, or at least plausible.
> Full review at: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260807111738.2055900-1-s-vadapalli@ti.com?part=1
> ---
> --- Patch [1]: [PATCH net] net: ethernet: ti: am65-cpsw-nuss: Fix port_id extraction from SRC TAG ---
> commit b0ed959d350c90d8b49f6f81eba7461fbc86dcf4
> Author: Siddharth Vadapalli <s-vadapalli@ti.com>
> 
> net: ethernet: ti: am65-cpsw-nuss: Fix port_id extraction from SRC TAG
> 
> The RX path extracts the ingress MAC port ID from the CPPI5 descriptor's
> 16-bit Source Tag. Only the lower 8 bits carry the port ID, so the patch
> masks the value with 0xFF before it is used as an index into
> common->ports[].
> 
>> diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
>> index 434a31080855..6330540979d7 100644
>> --- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c
>> +++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c
>> @@ -1310,6 +1310,8 @@ static int am65_cpsw_nuss_rx_packets(struct am65_cpsw_rx_flow *flow,
>>   	k3_udma_glue_rx_cppi5_to_dma_addr(rx_chn->rx_chn, &buf_dma);
>>   	pkt_len = cppi5_hdesc_get_pktlen(desc_rx);
>>   	cppi5_desc_get_tags_ids(&desc_rx->hdr, &port_id, NULL);
>> +	/* Port ID is contained in the lower 8-bits of the 16-bit Source Tag */
>> +	port_id &= 0xFF;
>>   	dev_dbg(dev, "%s rx port_id:%d\n", __func__, port_id);
>>   	port = am65_common_get_port(common, port_id);
>>   	ndev = port->ndev;
> 
> [Severity: High]
> [Finding: main-1-0]
> [Sources: opus-5]
> 
> The missing range check on port_id is pre-existing and not introduced by
> this patch, but since the change is specifically about avoiding the
> out-of-bounds access, would it be worth validating the value instead of
> relying only on the mask?

Hardware guarantees a valid Port ID in the lower 8-bits. A Software check 
is an unnecessary overhead and will impact performance since this is on the 
data-path and is not a one-time check during initialization.

> 
> After the mask, port_id is still an unvalidated hardware-supplied value in
> the range 0..255, and am65_common_get_port() does raw pointer arithmetic
> with no bounds check:
> 
> drivers/net/ethernet/ti/am65-cpsw-nuss.h:
>      #define am65_common_get_port(common, id) (&(common)->ports[(id) - 1])
> 
> common->ports is a devm_kcalloc() array of exactly common->port_num
> entries (1..AM65_CPSW_MAX_PORTS, checked in am65_cpsw_nuss_probe()), which
> is typically 1 or 2 on shipping parts. So port_id == 0 gives ports[-1] and

port_id will NOT be zero since port ID is a Hardware provided identifier of 
the Physical MAC Ports starting from '1'.

> any port_id above common->port_num reads past the end of the allocation.
> The resulting pointer is dereferenced right away in
> am65_cpsw_nuss_rx_packets():
> 
>      port = am65_common_get_port(common, port_id);
>      ndev = port->ndev;
>      ...
>      if (port->xdp_prog) {
> 
> and ndev then flows into am65_cpsw_build_skb(), netdev_priv(),
> netif_dormant() and ndev->stats.*. Can a stray low byte still produce the
> same class of crash the commit message describes?

Since Hardware guarantees that the lower 8-bits will always be the Port ID, 
the way Software expects it to be, additional checks aren't required.

> 
> The driver already enforces the required index domain for this accessor on
> the device tree path in am65_cpsw_nuss_init_slave_ports():
> 
>      if (!port_id || port_id > common->port_num) {
>          dev_err(dev, "%pOF has invalid port_id %u %s\n",
>              port_np, port_id, port_np->name);
>          ret = -EINVAL;
>          goto of_node_put;
>      }
> 
>      port = am65_common_get_port(common, port_id);
> 
> Would the same !port_id || port_id > common->port_num test in the RX path,
> dropping the packet and requeueing the page (bumping rx_errors, perhaps
> with a WARN_ON_ONCE), be a more robust fix than the mask alone?

Unlike am65_cpsw_init_slave_ports() function which is executed only once 
during initialization, am65_cpsw_nuss_rx_packets is executed for every 
packet that is received from the wire. More importantly, the sanity check 
for port_id in am65_cpsw_nuss_init_slave_ports() is performed on the 
device-tree provided MAC Port ID rather than a Hardware provided MAC Port 
ID. The comparison therefore isn't apt.

> 
> There is a second case even when the index is in range: ports disabled in
> the device tree never get an ndev allocated, and every other iteration site
> guards for that, for example in am65_cpsw_nuss_set_offload_fwd_mark():
> 
>      if (!port->ndev)
>          continue;
> 
> The RX path uses port->ndev unconditionally, so an in-range port_id
> belonging to a disabled port would hand a NULL net_device to
> am65_cpsw_build_skb() and netdev_priv(). Should that case be rejected too?

All MAC Ports that are disabled in the device-tree are kept disabled by the 
driver, so it is not possible to end up in a situation where the MAC Port 
ID in the RX DMA Descriptor contains a disabled MAC Port.

> 
> As a small nit, would a named mask defined alongside the other CPPI5/AM65
> definitions read better here than the bare 0xFF literal?

I don't see a real need for a macro given that a comment has been added 
just above, and there aren't other places where this is used at the moment. 
However, if reviewers believe that it should be replaced by a macro, I am 
open to doing so.

Regards,
Siddharth.



  reply	other threads:[~2026-08-11  5:06 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-07 11:17 [PATCH net] net: ethernet: ti: am65-cpsw-nuss: Fix port_id extraction from SRC TAG Siddharth Vadapalli
2026-08-09 20:27 ` Chintan Vankar
2026-08-10 16:56 ` Simon Horman
2026-08-11  5:08   ` Siddharth Vadapalli [this message]
2026-08-11  7:48     ` Simon Horman

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=d7841492-7e2a-4f4e-ae82-8058c7f4c6a5@ti.com \
    --to=s-vadapalli@ti.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=c-vankar@ti.com \
    --cc=daniel.zahka@gmail.com \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=grygorii.strashko@ti.com \
    --cc=horms@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=nm@ti.com \
    --cc=nora.schiffer@ew.tq-group.com \
    --cc=oss@vassilevski.com \
    --cc=pabeni@redhat.com \
    --cc=srk@ti.com \
    --cc=v-singh1@ti.com \
    --cc=vadim.fedorenko@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.