diff options
Diffstat (limited to 'net/core/skbuff.c')
-rw-r--r-- | net/core/skbuff.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 3c23760c5827..b8b106358040 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -639,6 +639,7 @@ struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask) | |||
639 | n->csum = skb->csum; | 639 | n->csum = skb->csum; |
640 | n->ip_summed = skb->ip_summed; | 640 | n->ip_summed = skb->ip_summed; |
641 | 641 | ||
642 | n->truesize += skb->data_len; | ||
642 | n->data_len = skb->data_len; | 643 | n->data_len = skb->data_len; |
643 | n->len = skb->len; | 644 | n->len = skb->len; |
644 | 645 | ||
@@ -1946,7 +1947,7 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) | |||
1946 | do { | 1947 | do { |
1947 | struct sk_buff *nskb; | 1948 | struct sk_buff *nskb; |
1948 | skb_frag_t *frag; | 1949 | skb_frag_t *frag; |
1949 | int hsize, nsize; | 1950 | int hsize; |
1950 | int k; | 1951 | int k; |
1951 | int size; | 1952 | int size; |
1952 | 1953 | ||
@@ -1957,11 +1958,10 @@ struct sk_buff *skb_segment(struct sk_buff *skb, int features) | |||
1957 | hsize = skb_headlen(skb) - offset; | 1958 | hsize = skb_headlen(skb) - offset; |
1958 | if (hsize < 0) | 1959 | if (hsize < 0) |
1959 | hsize = 0; | 1960 | hsize = 0; |
1960 | nsize = hsize + doffset; | 1961 | if (hsize > len || !sg) |
1961 | if (nsize > len + doffset || !sg) | 1962 | hsize = len; |
1962 | nsize = len + doffset; | ||
1963 | 1963 | ||
1964 | nskb = alloc_skb(nsize + headroom, GFP_ATOMIC); | 1964 | nskb = alloc_skb(hsize + doffset + headroom, GFP_ATOMIC); |
1965 | if (unlikely(!nskb)) | 1965 | if (unlikely(!nskb)) |
1966 | goto err; | 1966 | goto err; |
1967 | 1967 | ||