Le ven. 23 oct. 2026 à 13:59, Jamal Hadi Salim [off-list ref] a écrit :
The issue:
act_mpls POP can leave the inner Ethernet header in a page fragment after
skb_mpls_pop(), either on an L3 device (mac_len == 0) or chained after
act_vlan POP_ETH. A following eth_type_trans() can then BUG in
__skb_pull().
The Fix:
After the pop, if the original MAC header is shorter than ETH_HLEN, pull
the inner Ethernet header into the linear area and drop only when
pskb_may_pull(skb, ETH_HLEN) fails. skb_mpls_pop() does nothing when the
skb was not MPLS, so no separate state is needed.
Conditions to recreate the bug:
- egress tc filter on lo: action vlan pop_eth action mpls pop
(chained), or on an L3 device where mac_len == 0.
- AF_PACKET SOCK_RAW with PACKET_VNET_HDR, hdr_len=28, and a non-linear
eth / mpls / inner-eth frame.
- The inner header is in page frags; a following eth_type_trans() can BUG
in __skb_pull().
Reviewed-by: Eric Dumazet<edumazet@kernel.org>