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)  	if (ip_is_fragment(&iph)) {  		skb = skb_share_check(skb, GFP_ATOMIC);  		if (skb) { -			if (!pskb_may_pull(skb, netoff + iph.ihl * 4)) -				return skb; -			if (pskb_trim_rcsum(skb, netoff + len)) -				return skb; +			if (!pskb_may_pull(skb, netoff + iph.ihl * 4)) { +				kfree_skb(skb); +				return NULL; +			} +			if (pskb_trim_rcsum(skb, netoff + len)) { +				kfree_skb(skb); +				return NULL; +			}  			memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));  			if (ip_defrag(net, skb, user))  				return NULL;  |