]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net: usb: qmi_wwan: initialize MAC header offset in qmimux_rx_fixup
authorQendrim Maxhuni <qendrim.maxhuni@garderos.com>
Wed, 29 Oct 2025 07:57:44 +0000 (08:57 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 4 Nov 2025 01:36:49 +0000 (17:36 -0800)
Raw IP packets have no MAC header, leaving skb->mac_header uninitialized.
This can trigger kernel panics on ARM64 when xfrm or other subsystems
access the offset due to strict alignment checks.

Initialize the MAC header to prevent such crashes.

This can trigger kernel panics on ARM when running IPsec over the
qmimux0 interface.

Example trace:

    Internal error: Oops: 000000009600004f [#1] SMP
    CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.12.34-gbe78e49cb433 #1
    Hardware name: LS1028A RDB Board (DT)
    pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
    pc : xfrm_input+0xde8/0x1318
    lr : xfrm_input+0x61c/0x1318
    sp : ffff800080003b20
    Call trace:
     xfrm_input+0xde8/0x1318
     xfrm6_rcv+0x38/0x44
     xfrm6_esp_rcv+0x48/0xa8
     ip6_protocol_deliver_rcu+0x94/0x4b0
     ip6_input_finish+0x44/0x70
     ip6_input+0x44/0xc0
     ipv6_rcv+0x6c/0x114
     __netif_receive_skb_one_core+0x5c/0x8c
     __netif_receive_skb+0x18/0x60
     process_backlog+0x78/0x17c
     __napi_poll+0x38/0x180
     net_rx_action+0x168/0x2f0

Fixes: c6adf77953bc ("net: usb: qmi_wwan: add qmap mux protocol support")
Signed-off-by: Qendrim Maxhuni <qendrim.maxhuni@garderos.com>
Link: https://patch.msgid.link/20251029075744.105113-1-qendrim.maxhuni@garderos.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/usb/qmi_wwan.c

index 11352d85475ae2b42dc10bc220dd17c69f63c2d1..3a4985b582cb1255a95f4467b88b16ce3513e260 100644 (file)
@@ -192,6 +192,12 @@ static int qmimux_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
                if (!skbn)
                        return 0;
 
+              /* Raw IP packets don't have a MAC header, but other subsystems
+               * (like xfrm) may still access MAC header offsets, so they must
+               * be initialized.
+               */
+               skb_reset_mac_header(skbn);
+
                switch (skb->data[offset + qmimux_hdr_sz] & 0xf0) {
                case 0x40:
                        skbn->protocol = htons(ETH_P_IP);