diff options
Diffstat (limited to 'net/ipv6/ip6_output.c')
-rw-r--r-- | net/ipv6/ip6_output.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 85f889270492..e05ecbb1412d 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -624,14 +624,13 @@ static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
624 | skb_shinfo(skb)->frag_list = NULL; | 624 | skb_shinfo(skb)->frag_list = NULL; |
625 | /* BUILD HEADER */ | 625 | /* BUILD HEADER */ |
626 | 626 | ||
627 | tmp_hdr = kmalloc(hlen, GFP_ATOMIC); | 627 | tmp_hdr = kmemdup(skb->nh.raw, hlen, GFP_ATOMIC); |
628 | if (!tmp_hdr) { | 628 | if (!tmp_hdr) { |
629 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); | 629 | IP6_INC_STATS(ip6_dst_idev(skb->dst), IPSTATS_MIB_FRAGFAILS); |
630 | return -ENOMEM; | 630 | return -ENOMEM; |
631 | } | 631 | } |
632 | 632 | ||
633 | *prevhdr = NEXTHDR_FRAGMENT; | 633 | *prevhdr = NEXTHDR_FRAGMENT; |
634 | memcpy(tmp_hdr, skb->nh.raw, hlen); | ||
635 | __skb_pull(skb, hlen); | 634 | __skb_pull(skb, hlen); |
636 | fh = (struct frag_hdr*)__skb_push(skb, sizeof(struct frag_hdr)); | 635 | fh = (struct frag_hdr*)__skb_push(skb, sizeof(struct frag_hdr)); |
637 | skb->nh.raw = __skb_push(skb, hlen); | 636 | skb->nh.raw = __skb_push(skb, hlen); |