FAILED: patch "[PATCH] net: lan78xx: Fix race in tx pending skb size calculation" failed to apply to 4.4-stable tree
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
dea39aca1d7aef1e2b95b07edeacf04cc8863a2eMon Sep 17 00:00:00 2001
From: Stefan Wahren <[email protected]>
Date: Sun, 15 Jul 2018 21:53:20 +0200
Subject: [PATCH] net: lan78xx: Fix race in tx pending skb size calculation
The skb size calculation in lan78xx_tx_bh is in race with the start_xmit, which could lead to rare kernel oopses. So protect the whole skb walk with a spin lock. As a benefit we can unlink the skb directly.
This patch was tested on Raspberry Pi 3B+
drivers/net/usb/lan78xx.c +4 -1
@@ -3344,6 +3344,7 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev) pkt_cnt =0 ; count =0 ; length =0 ; +spin_lock_irqsave (&tqp->lock, flags);for (skb = tqp->next; pkt_cnt < tqp->qlen; skb = skb->next) {if (skb_is_gso (skb)) {if (pkt_cnt) {
@@ -3352,7 +3353,8 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev) } count =1 ; length = skb->len -TX_OVERHEAD ; - skb2 =skb_dequeue (tqp); +__skb_unlink (skb, tqp); +spin_unlock_irqrestore (&tqp->lock, flags); goto gso_skb; }
@@ -3361,6 +3363,7 @@ static void lan78xx_tx_bh(struct lan78xx_net *dev) skb_totallen = skb->len +roundup (skb_totallen,sizeof (u32)); pkt_cnt++; } +spin_unlock_irqrestore (&tqp->lock, flags);/* copy to a single skb */ skb =alloc_skb (skb_totallen,GFP_ATOMIC );