* [PATCH v3] team: reject CAN and IEEE 802.15.4 devices in team_port_add
@ 2026-10-13 8:35 Oliver Hartkopp
2026-10-13 8:39 ` netdev-bot+sinfo
2026-10-14 8:37 ` netdev-bot+sashiko
0 siblings, 2 replies; 5+ messages in thread
From: Oliver Hartkopp @ 2026-10-13 8:35 UTC (permalink / raw)
To: Jiri Pirko, netdev
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Jiale Yao, Oliver Hartkopp
From: Jiale Yao <yaojiale02@163.com>
Enslaving a CAN or IEEE 802.15.4 device (e.g. vxcan, wpan0) to a
team master triggers a NULL pointer dereference because these
device types use different Layer 2 architectures from Ethernet and
the team driver never initializes their private mid-layer data
structures.
Reject ARPHRD_CAN, ARPHRD_IEEE802154, and ARPHRD_IEEE802154_MONITOR
devices in team_port_add(), mirroring the existing CAN check already
present in the bonding driver since commit 8ba68464e478 ("bonding:
refuse to enslave CAN devices").
Link: https://lore.kernel.org/all/b58d98e0-8fe3-4e4e-b8a5-c1c7e647ccca@hartkopp.net/
Fixes: 1d76efe1577b ("team: add support for non-ethernet devices")
Assisted-by: Claude:deepseek-v4-pro
Signed-off-by: Jiale Yao <yaojiale02@163.com>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
---
v3: [Hartkopp] fixed indention and compilation as reported by kernel test robot
---
drivers/net/team/team_core.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/net/team/team_core.c b/drivers/net/team/team_core.c
index ca75f08e3c59..5f1708c2a344 100644
--- a/drivers/net/team/team_core.c
+++ b/drivers/net/team/team_core.c
@@ -1223,10 +1223,20 @@ static int team_port_add(struct team *team, struct net_device *port_dev,
netdev_err(dev, "Device %s is loopback device. Loopback devices can't be added as a team port\n",
portname);
return -EINVAL;
}
+ if (port_dev->type == ARPHRD_CAN ||
+ port_dev->type == ARPHRD_IEEE802154 ||
+ port_dev->type == ARPHRD_IEEE802154_MONITOR) {
+ NL_SET_ERR_MSG(extack,
+ "CAN and IEEE 802.15.4 devices can't be added as a team port");
+ netdev_err(dev, "Device %s is CAN or IEEE 802.15.4. These device types can't be added as a team port\n",
+ portname);
+ return -EINVAL;
+ }
+
if (netif_is_team_port(port_dev)) {
NL_SET_ERR_MSG(extack, "Device is already a port of a team device");
netdev_err(dev, "Device %s is already a port "
"of a team device\n", portname);
return -EBUSY;
--
2.53.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3] team: reject CAN and IEEE 802.15.4 devices in team_port_add
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
1 sibling, 1 reply; 5+ messages in thread
From: netdev-bot+sinfo @ 2026-10-13 8:39 UTC (permalink / raw)
To: Oliver Hartkopp
Cc: Jiri Pirko, netdev, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Jiale Yao
Hi!
This is an automated message. This series looks like a fix, but its
commit messages seem to be missing some information:
- How the issue was discovered, e.g. hit in production, hit during
development, syzbot report, manual code inspection, LLM or static
analysis tool scan.
Please do not repost the series just to address the above. Instead,
reply to this email with the missing information, so that reviewers
can take it into account. If the series needs another revision for
other reasons, please include the information in the commit messages
then.
The evaluation is done by an LLM so it may be wrong, if you think
that is the case please reply and explain.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] team: reject CAN and IEEE 802.15.4 devices in team_port_add
2026-10-13 8:39 ` netdev-bot+sinfo
@ 2026-10-13 9:21 ` Oliver Hartkopp
0 siblings, 0 replies; 5+ messages in thread
From: Oliver Hartkopp @ 2026-10-13 9:21 UTC (permalink / raw)
To: netdev-bot+sinfo
Cc: Jiri Pirko, netdev, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Jiale Yao
The issue was found by code inspection (LLM-assisted, see the
Assisted-by tag), following the syzbot report against the bonding
driver (syzbot+8ed98cbd0161632bce95), which was fixed by commit
8ba68464e478 ("bonding: refuse to enslave CAN devices").
team_setup_by_port() copies port_dev->type into the team device in
the same way, so a team master with a vxcan port ends up as an
ARPHRD_CAN device without can_ml_priv, and runs into the same
NULL pointer dereference (e.g. via isotp_release() ->
can_rx_unregister()).
The same class of problem (non-CAN netdevs claiming ARPHRD_CAN
without CAN ml_priv) was already hit by syzbot in the CAN core and
mitigated there, see 8aa59e355949 ("can: af_can: fix NULL pointer
dereference in can_rx_register()") and 0acc442309a0 ("can: af_can:
fix NULL pointer dereference in can_rcv_filter",
syzbot+2d7f58292cb5b29eb5ad), both with bonding/tun.
The IEEE 802.15.4 types were added by analogy during review.
Best regards,
Oliver
On 13.10.26 10:39, netdev-bot+sinfo@kernel.org wrote:
> Hi!
>
> This is an automated message. This series looks like a fix, but its
> commit messages seem to be missing some information:
>
> - How the issue was discovered, e.g. hit in production, hit during
> development, syzbot report, manual code inspection, LLM or static
> analysis tool scan.
>
> Please do not repost the series just to address the above. Instead,
> reply to this email with the missing information, so that reviewers
> can take it into account. If the series needs another revision for
> other reasons, please include the information in the commit messages
> then.
>
> The evaluation is done by an LLM so it may be wrong, if you think
> that is the case please reply and explain.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] team: reject CAN and IEEE 802.15.4 devices in team_port_add
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-14 8:37 ` netdev-bot+sashiko
2026-10-14 11:49 ` Oliver Hartkopp
1 sibling, 1 reply; 5+ messages in thread
From: netdev-bot+sashiko @ 2026-10-14 8:37 UTC (permalink / raw)
To: socketcan
Cc: jiri, netdev, andrew+netdev, davem, edumazet, kuba, pabeni,
yaojiale02
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.
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?
[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?
> + NL_SET_ERR_MSG(extack,
> + "CAN and IEEE 802.15.4 devices can't be added as a team port");
[ ... ]
--
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20261013083523.4728-1-socketcan%40hartkopp.net
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3] team: reject CAN and IEEE 802.15.4 devices in team_port_add
2026-10-14 8:37 ` netdev-bot+sashiko
@ 2026-10-14 11:49 ` Oliver Hartkopp
0 siblings, 0 replies; 5+ messages in thread
From: Oliver Hartkopp @ 2026-10-14 11:49 UTC (permalink / raw)
To: netdev-bot+sashiko
Cc: jiri, netdev, andrew+netdev, davem, edumazet, kuba, pabeni,
yaojiale02
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");
>
> [ ... ]
>
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-10-14 11:50 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox