diff options
Diffstat (limited to 'net/ipv4/ip_fragment.c')
-rw-r--r-- | net/ipv4/ip_fragment.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c index 9b0158fa431f..d6ee343fdb86 100644 --- a/net/ipv4/ip_fragment.c +++ b/net/ipv4/ip_fragment.c | |||
@@ -722,10 +722,14 @@ struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user) | |||
722 | if (ip_is_fragment(&iph)) { | 722 | if (ip_is_fragment(&iph)) { |
723 | skb = skb_share_check(skb, GFP_ATOMIC); | 723 | skb = skb_share_check(skb, GFP_ATOMIC); |
724 | if (skb) { | 724 | if (skb) { |
725 | if (!pskb_may_pull(skb, netoff + iph.ihl * 4)) | 725 | if (!pskb_may_pull(skb, netoff + iph.ihl * 4)) { |
726 | return skb; | 726 | kfree_skb(skb); |
727 | if (pskb_trim_rcsum(skb, netoff + len)) | 727 | return NULL; |
728 | return skb; | 728 | } |
729 | if (pskb_trim_rcsum(skb, netoff + len)) { | ||
730 | kfree_skb(skb); | ||
731 | return NULL; | ||
732 | } | ||
729 | memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); | 733 | memset(IPCB(skb), 0, sizeof(struct inet_skb_parm)); |
730 | if (ip_defrag(net, skb, user)) | 734 | if (ip_defrag(net, skb, user)) |
731 | return NULL; | 735 | return NULL; |