skbuff: skb_copy_ubufs must release uarg even without user frags
[ Upstream commitpull/10/headb90ddd5687
] 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:3ece782693
("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> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
parent
17155ea827
commit
49cd180d4a
|
@ -1182,7 +1182,7 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask)
|
|||
u32 d_off;
|
||||
|
||||
if (!num_frags)
|
||||
return 0;
|
||||
goto release;
|
||||
|
||||
if (skb_shared(skb) || skb_unclone(skb, gfp_mask))
|
||||
return -EINVAL;
|
||||
|
@ -1242,6 +1242,7 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask)
|
|||
__skb_fill_page_desc(skb, new_frags - 1, head, 0, d_off);
|
||||
skb_shinfo(skb)->nr_frags = new_frags;
|
||||
|
||||
release:
|
||||
skb_zcopy_clear(skb, false);
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue