|
@@ -722,10 +722,14 @@ struct sk_buff *ip_check_defrag(struct net *net, struct sk_buff *skb, u32 user)
|
|
if (ip_is_fragment(&iph)) {
|
|
if (ip_is_fragment(&iph)) {
|
|
skb = skb_share_check(skb, GFP_ATOMIC);
|
|
skb = skb_share_check(skb, GFP_ATOMIC);
|
|
if (skb) {
|
|
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));
|
|
memset(IPCB(skb), 0, sizeof(struct inet_skb_parm));
|
|
if (ip_defrag(net, skb, user))
|
|
if (ip_defrag(net, skb, user))
|
|
return NULL;
|
|
return NULL;
|