Commit 089e58805c45 for kernel

commit 089e58805c452e52179482b1025a8e309a57f801
Author: Josef Bacik <josef@toxicpanda.com>
Date:   Wed Oct 7 17:55:40 2026 +0000

    xen/netfront: drop RX packets with a short Ethernet header

    handle_incoming_queue() pulls pull_to bytes into the head before
    calling eth_type_trans().  pull_to is the length of the first RX slot,
    capped at RX_COPY_THRESHOLD, and that length comes from the backend.
    Nothing checks it against ETH_HLEN.

    If the first slot is shorter than ETH_HLEN and more slots follow, the
    head ends up shorter than an Ethernet header while skb->len is longer,
    and eth_type_trans() BUG()s in __skb_pull().  If the whole packet is
    shorter than ETH_HLEN, eth_type_trans() reads the header past the end
    of the data instead.

    Pull at least ETH_HLEN, and drop the packet if that fails, which also
    drops packets too short to hold an Ethernet header.  This also checks
    the return value of the pull, which was ignored.

    Fixes: 0d160211965b ("xen: add virtual network device driver")
    Cc: stable@vger.kernel.org
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Link: https://patch.msgid.link/20261007-b4-xen-netfront-short-head-v1-1-12d7113a7e4e@toxicpanda.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index 2ed673649c48..d269457e839e 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -1234,8 +1234,16 @@ static int handle_incoming_queue(struct netfront_queue *queue,
 	while ((skb = __skb_dequeue(rxq)) != NULL) {
 		int pull_to = NETFRONT_SKB_CB(skb)->pull_to;

-		if (pull_to > skb_headlen(skb))
-			__pskb_pull_tail(skb, pull_to - skb_headlen(skb));
+		/* pull_to comes from the first slot's length, which the
+		 * backend controls.  Make sure the head holds at least an
+		 * Ethernet header for eth_type_trans().
+		 */
+		if (!pskb_may_pull(skb, max(pull_to, ETH_HLEN))) {
+			kfree_skb(skb);
+			packets_dropped++;
+			queue->info->netdev->stats.rx_errors++;
+			continue;
+		}

 		/* Ethernet work: Delayed to here as it peeks the header. */
 		skb->protocol = eth_type_trans(skb, queue->info->netdev);