Commit 77c01a54 authored by Michael S. Tsirkin's avatar Michael S. Tsirkin Committed by Ben Hutchings

skbuff: skb_segment: orphan frags before copying

commit 1fd819ec upstream.

skb_segment copies frags around, so we need
to copy them carefully to avoid accessing
user memory after reporting completion to userspace
through a callback.

skb_segment doesn't normally happen on datapath:
TSO needs to be disabled - so disabling zero copy
in this case does not look like a big deal.
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Acked-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
[bwh: Backported to 3.2.  As skb_segment() only supports page-frags *or* a
 frag list, there is no need for the additional frag_skb pointer or the
 preparatory renaming.]
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent 3ee479fd
...@@ -2698,6 +2698,9 @@ struct sk_buff *skb_segment(struct sk_buff *skb, u32 features) ...@@ -2698,6 +2698,9 @@ struct sk_buff *skb_segment(struct sk_buff *skb, u32 features)
skb_put(nskb, hsize), hsize); skb_put(nskb, hsize), hsize);
while (pos < offset + len && i < nfrags) { while (pos < offset + len && i < nfrags) {
if (unlikely(skb_orphan_frags(skb, GFP_ATOMIC)))
goto err;
*frag = skb_shinfo(skb)->frags[i]; *frag = skb_shinfo(skb)->frags[i];
__skb_frag_ref(frag); __skb_frag_ref(frag);
size = skb_frag_size(frag); size = skb_frag_size(frag);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment