Skip to content

Commit 6715e8b

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 1f9c828556416fbe3f49386708ce999fc4d4da06) Signed-off-by: Wentao Guan <guanwentao@uniontech.com>
1 parent 9deac9a commit 6715e8b

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
@@ -110,6 +110,9 @@ int skb_gro_receive(struct sk_buff *p, struct sk_buff *skb)
110110
if (p->pp_recycle != skb->pp_recycle)
111111
return -ETOOMANYREFS;
112112

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

0 commit comments

Comments
 (0)