Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

skbuff: skb_copy_ubufs must release uarg even without user frags

skb_copy_ubufs creates a private copy of frags[] to release its hold
on user frags, then calls uarg->callback to notify the owner.

Call uarg->callback even when no frags exist. This edge case can
happen when zerocopy_sg_from_iter finds enough room in skb_headlen
to copy all the data.

Fixes: 3ece782693c4 ("sock: skb_copy_ubufs support for compound pages")
Signed-off-by: Willem de Bruijn <willemb@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Willem de Bruijn and committed by
David S. Miller
b90ddd56 268b7906

+2 -1
+2 -1
net/core/skbuff.c
··· 1178 1178 u32 d_off; 1179 1179 1180 1180 if (!num_frags) 1181 - return 0; 1181 + goto release; 1182 1182 1183 1183 if (skb_shared(skb) || skb_unclone(skb, gfp_mask)) 1184 1184 return -EINVAL; ··· 1238 1238 __skb_fill_page_desc(skb, new_frags - 1, head, 0, d_off); 1239 1239 skb_shinfo(skb)->nr_frags = new_frags; 1240 1240 1241 + release: 1241 1242 skb_zcopy_clear(skb, false); 1242 1243 return 0; 1243 1244 }