Netdev List
 help / color / mirror / Atom feed
From: Oliver Hartkopp <socketcan@hartkopp.net>
To: netdev-bot+sashiko@kernel.org
Cc: jiri@resnulli.us, netdev@vger.kernel.org, andrew+netdev@lunn.ch,
	davem@davemloft.net, edumazet@kernel.org, kuba@kernel.org,
	pabeni@redhat.com, yaojiale02@163.com
Subject: Re: [PATCH v3] team: reject CAN and IEEE 802.15.4 devices in team_port_add
Date: Wed, 14 Oct 2026 13:49:55 +0200	[thread overview]
Message-ID: <bf99c42f-92eb-4e4f-aba4-1aeda5b84f65@hartkopp.net> (raw)
In-Reply-To: <179196707247.434549.3372737964220312421@kernel.org>



On 14.10.26 10:37, netdev-bot+sashiko@kernel.org wrote:
> Thank you for your contribution! Sashiko AI review found 1 potential
> issue(s) to consider.
> 
> Critical: 0 · High: 1 (1) · Medium: 0 · Low: 0
> 
> If you believe none of the issues are legitimate, please reply to each
> issue of Medium severity or higher and explain why the AI is wrong.
> If any of them are legitimate and you plan to respin, please let patchwork
> know by including "pw-bot: cr" as a separate line at the end of your reply
> (one such reply per series is enough).
> 
> - [High] The new denylist in team_port_add()
>    (drivers/net/team/team_core.c:1228-1236) only rejects ARPHRD_CAN,…
> 
> Pre-existing issues:
> - [High] This problem wasn't introduced by this patch, but the bonding
>    driver, which the commit message cites as the precedent being…
> 
> --
> 
> team: reject CAN and IEEE 802.15.4 devices in team_port_add
> 
> This patch makes team_port_add() reject ports of type ARPHRD_CAN,
> ARPHRD_IEEE802154 and ARPHRD_IEEE802154_MONITOR. Team never sets up the
> private mid-layer data these L2 types expect, so enslaving one leads to a
> NULL pointer dereference. The check mirrors the CAN check bonding has had
> since commit 8ba68464e478.
> 
> Link: https://lore.kernel.org/all/b58d98e0-8fe3-4e4e-b8a5-c1c7e647ccca@hartkopp.net/
> 
>> diff --git a/drivers/net/team/team_core.c b/drivers/net/team/team_core.c
>> index ca75f08e3c593..5f1708c2a3445 100644
>> --- a/drivers/net/team/team_core.c
>> +++ b/drivers/net/team/team_core.c
>> @@ -1225,6 +1225,16 @@ static int team_port_add(struct team *team, struct net_device *port_dev,
>>   		return -EINVAL;
>>   	}
>>   
>> +	if (port_dev->type == ARPHRD_CAN ||
>> +	    port_dev->type == ARPHRD_IEEE802154 ||
>> +	    port_dev->type == ARPHRD_IEEE802154_MONITOR) {
> 
> [Severity: High]
> Does this list cover the whole class of devices the commit message
> describes? ARPHRD_6LOWPAN devices still seem to get through
> team_port_add(). Examples are lowpan0 on top of wpan0, or a Bluetooth bt0.

I'll send a v4 covering ARPHRD_6LOWPAN too.
> For the first port of a different type, the call chain
> team_port_add()->team_dev_type_check_change()->team_setup_by_port() copies
> the port's type onto the team device:
> 
> drivers/net/team/team_core.c:team_setup_by_port() {
>      ...
> 	dev->type = port_dev->type;
>      ...
> }
> 
> At that point netdev_priv() of the team device is still a struct team. None
> of the NETDEV_PRE_TYPE_CHANGE notifiers seem to refuse the change here. The
> team device's inet6_dev also survives it.
> 
> The global lowpan notifier checks only the type and the inet6_dev before it
> writes through lowpan_dev(dev):
> 
> net/6lowpan/core.c:lowpan_event() {
> 	if (dev->type != ARPHRD_6LOWPAN)
> 		return NOTIFY_DONE;
> 
> 	idev = __in6_dev_get(dev);
> 	if (!idev)
> 		return NOTIFY_DONE;
>      ...
> 	case NETDEV_DOWN:
> 		for (i = 0; i < LOWPAN_IPHC_CTX_TABLE_SIZE; i++)
> 			clear_bit(LOWPAN_IPHC_CTX_FLAG_ACTIVE,
> 				  &lowpan_dev(dev)->ctx.table[i].flags);
>      ...
> }
> 
> When the team device is set down, would these 16 clear_bit() calls write
> into struct team? The exact offsets depend on the config. On a typical
> x86_64 config without spinlock debugging, they appear to hit:
> 
> - notify_peers.dw.work.data (the pending bit)
> - notify_peers.dw.timer.flags
> - mcast_rejoin.count_pending
> - mode_priv[0]
> 
> The last write lands at about sizeof(struct team), which is just past the
> private area.
> 
> On NETDEV_UP and NETDEV_CHANGE, lowpan_is_ll() also reads
> lowpan_dev(dev)->lltype. That field overlaps team->pcpu_stats.
> 
> Would an allowlist of supported port types be more robust here than a
> longer denylist?

No. We had that discussion already on the ML.

team (like bonding) intentionally supports non-Ethernet ports via 
team_setup_by_port() (e.g. IPoIB), so an allowlist would regress 
existing users. The denylist targets the L2 types whose stacks rely on 
type-specific private data.


> [Severity: High]
> This is a pre-existing issue, not one introduced by this patch. The commit
> message says this change mirrors a bonding check, but that check only
> rejects CAN:
> 
> drivers/net/bonding/bond_main.c:bond_enslave() {
>      ...
> 	if (slave_dev->type == ARPHRD_CAN) {
> 		BOND_NL_ERR(bond_dev, extack,
> 			    "CAN devices cannot be enslaved");
> 		return -EPERM;
> 	}
>      ...
> }
> 
> Does bonding have the same IEEE 802.15.4 hole? For a non-Ethernet first
> slave, bond_enslave()->bond_setup_by_slave() copies slave_dev->type onto
> the bond. A wpan device appears to pass all the remaining checks. The bond
> then ends up as ARPHRD_IEEE802154 with a NULL ieee802154_ptr.
> 
> ieee802154_get_dev() filters only on the type before it dereferences that
> pointer:
> 
> net/ieee802154/socket.c:ieee802154_get_dev() {
>      ...
> 		for_each_netdev(net, tmp) {
> 			if (tmp->type != ARPHRD_IEEE802154)
> 				continue;
> 
> 			pan_id = tmp->ieee802154_ptr->pan_id;
>      ...
> }
> 
> This path runs from bind() or connect() with a short address on an
> AF_IEEE802154 SOCK_DGRAM socket. ieee802154_create() needs no capability
> for SOCK_DGRAM.
> 
> Once a bond has a wpan slave, could an unprivileged user oops the kernel
> this way? Should bond_enslave() get the same IEEE 802.15.4 checks in a
> separate patch?

Yes. When this team patch is settled and shows up in the tree, I'll 
create a follow-up for bonding for those 4 exceptions.

Best regards,
Oliver

> 
>> +		NL_SET_ERR_MSG(extack,
>> +			       "CAN and IEEE 802.15.4 devices can't be added as a team port");
> 
> [ ... ]
> 


      reply	other threads:[~2026-10-14 11:50 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-13  8:35 [PATCH v3] team: reject CAN and IEEE 802.15.4 devices in team_port_add Oliver Hartkopp
2026-10-13  8:39 ` netdev-bot+sinfo
2026-10-13  9:21   ` Oliver Hartkopp
2026-10-14  8:37 ` netdev-bot+sashiko
2026-10-14 11:49   ` Oliver Hartkopp [this message]

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=bf99c42f-92eb-4e4f-aba4-1aeda5b84f65@hartkopp.net \
    --to=socketcan@hartkopp.net \
    --cc=andrew+netdev@lunn.ch \
    --cc=davem@davemloft.net \
    --cc=edumazet@kernel.org \
    --cc=jiri@resnulli.us \
    --cc=kuba@kernel.org \
    --cc=netdev-bot+sashiko@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=yaojiale02@163.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox