mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 13:41:51 +00:00
net: usb: ax88179_178a: stop lying about skb->truesize
Some usb drivers try to set small skb->truesize and break core networking stacks. In this patch, I removed one of the skb->truesize overide. I also replaced one skb_clone() by an allocation of a fresh and small skb, to get minimally sized skbs, like we did in commit1e2c611723
("net: cdc_ncm: reduce skb truesize in rx path") Fixes:f8ebb3ac88
("net: usb: ax88179_178a: Fix packet receiving") Reported-by: shironeko <shironeko@tesaguri.club> Closes: https://lore.kernel.org/netdev/c110f41a0d2776b525930f213ca9715c@tesaguri.club/ Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Jose Alonso <joalonsof@gmail.com> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://lore.kernel.org/r/20240421193828.1966195-1-edumazet@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
58a4c9b1e5
commit
4ce62d5b2f
@ -1456,21 +1456,16 @@ static int ax88179_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
|
|||||||
/* Skip IP alignment pseudo header */
|
/* Skip IP alignment pseudo header */
|
||||||
skb_pull(skb, 2);
|
skb_pull(skb, 2);
|
||||||
|
|
||||||
skb->truesize = SKB_TRUESIZE(pkt_len_plus_padd);
|
|
||||||
ax88179_rx_checksum(skb, pkt_hdr);
|
ax88179_rx_checksum(skb, pkt_hdr);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ax_skb = skb_clone(skb, GFP_ATOMIC);
|
ax_skb = netdev_alloc_skb_ip_align(dev->net, pkt_len);
|
||||||
if (!ax_skb)
|
if (!ax_skb)
|
||||||
return 0;
|
return 0;
|
||||||
skb_trim(ax_skb, pkt_len);
|
skb_put(ax_skb, pkt_len);
|
||||||
|
memcpy(ax_skb->data, skb->data + 2, pkt_len);
|
||||||
|
|
||||||
/* Skip IP alignment pseudo header */
|
|
||||||
skb_pull(ax_skb, 2);
|
|
||||||
|
|
||||||
skb->truesize = pkt_len_plus_padd +
|
|
||||||
SKB_DATA_ALIGN(sizeof(struct sk_buff));
|
|
||||||
ax88179_rx_checksum(ax_skb, pkt_hdr);
|
ax88179_rx_checksum(ax_skb, pkt_hdr);
|
||||||
usbnet_skb_return(dev, ax_skb);
|
usbnet_skb_return(dev, ax_skb);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user