lan937x_xmit() reads the Ethernet header via eth_hdr(skb) to test the destination address. The sibling xmit paths in this file (ksz8795_xmit, ksz9477_xmit, ksz9893_xmit) already use skb_eth_hdr(); lan937x_xmit() is the lone hold-out. On the AF_PACKET SOCK_RAW + PACKET_QDISC_BYPASS transmit path the skb reaches ndo_start_xmit() with the MAC header unset, so eth_hdr(skb) resolves to skb->head + (u16)~0 and the read is out of bounds. On the TX path the L2 header is at skb->data, so use skb_eth_hdr(), as done for the same class by commit f5089008f90c ("macsec: don't read an unset MAC header in macsec_encrypt()") and commit 96cc4b69581d ("macvlan: do not assume mac_header is set in macvlan_broadcast()"). Fixes: 092f875131dc ("net: dsa: tag_ksz: add tag handling for Microchip LAN937x") Cc: stable@vger.kernel.org Found by 0sec automated security-research tooling (https://0sec.ai). Assisted-by: 0sec:claude-opus-4-8 Signed-off-by: Doruk Tan Ozturk --- net/dsa/tag_ksz.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/dsa/tag_ksz.c b/net/dsa/tag_ksz.c index 67fa89f102e0..4f74336ae396 100644 --- a/net/dsa/tag_ksz.c +++ b/net/dsa/tag_ksz.c @@ -430,7 +430,7 @@ static struct sk_buff *lan937x_xmit(struct sk_buff *skb, u16 queue_mapping = skb_get_queue_mapping(skb); u8 prio = netdev_txq_to_tc(dev, queue_mapping); struct dsa_port *dp = dsa_user_to_port(dev); - const struct ethhdr *hdr = eth_hdr(skb); + const struct ethhdr *hdr = skb_eth_hdr(skb); __be16 *tag; u16 val; -- 2.43.0