Skip to content

Commit 81a9934

Browse files
qsnopsiff
authored andcommitted
net: gro: don't merge zcopy skbs
[ Upstream commit 4db79a322db8c97f7b73b8a347395ef4d685eb40 ] skb_gro_receive() can currently copy frags between the source and GRO skb, without checking the zerocopy status, and in particular the SKBFL_MANAGED_FRAG_REFS flag. When SKBFL_MANAGED_FRAG_REFS is set, the skb doesn't hold a reference on the pages in shinfo->frags. Appending those frags to another skb's frags without fixing up the page refcount can lead to UAF. When either the last skb in the GRO chain (the one we would append frags to) or the source skb is zerocopy, don't merge the skbs. Fixes: 753f1ca ("net: introduce managed frags infrastructure") Reported-by: Huzaifa Sidhpurwala <huzaifas@redhat.com> Signed-off-by: Sabrina Dubroca <sd@queasysnail.net> Reviewed-by: Willem de Bruijn <willemb@google.com> Link: https://patch.msgid.link/c3b7f906bbfcbdfd7b4fa9d6c18a438870df85be.1779307748.git.sd@queasysnail.net Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org> (cherry picked from commit e334cbf3388fd9334503a778a82d9e9f14dd2f71) Signed-off-by: Wentao Guan <guanwentao@uniontech.com>
1 parent 2ca8ea7 commit 81a9934

1 file changed

Lines changed: 3 additions & 0 deletions

File tree

net/core/gro.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ int skb_gro_receive(struct sk_buff *p, struct sk_buff *skb)
109109
if (p->pp_recycle != skb->pp_recycle)
110110
return -ETOOMANYREFS;
111111

112+
if (skb_zcopy(p) || skb_zcopy(skb))
113+
return -ETOOMANYREFS;
114+
112115
if (unlikely(p->len + len >= netif_get_gro_max_size(p->dev, p) ||
113116
NAPI_GRO_CB(skb)->flush))
114117
return -E2BIG;

0 commit comments

Comments
 (0)