Loading net/ipv6/netfilter/nf_conntrack_reasm.c +10 −5 Original line number Diff line number Diff line Loading @@ -230,7 +230,7 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, if ((unsigned int)end > IPV6_MAXPLEN) { pr_debug("offset is too large.\n"); return -1; return -EINVAL; } ecn = ip6_frag_ecn(ipv6_hdr(skb)); Loading Loading @@ -263,7 +263,7 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, * this case. -DaveM */ pr_debug("end of fragment not rounded to 8 bytes.\n"); return -1; return -EPROTO; } if (end > fq->q.len) { /* Some bits beyond end -> corruption. */ Loading Loading @@ -357,7 +357,7 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, discard_fq: inet_frag_kill(&fq->q, &nf_frags); err: return -1; return -EINVAL; } /* Loading Loading @@ -566,6 +566,7 @@ find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff) int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user) { u16 savethdr = skb->transport_header; struct net_device *dev = skb->dev; int fhoff, nhoff, ret; struct frag_hdr *fhdr; Loading Loading @@ -599,8 +600,12 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user) spin_lock_bh(&fq->q.lock); if (nf_ct_frag6_queue(fq, skb, fhdr, nhoff) < 0) { ret = -EINVAL; ret = nf_ct_frag6_queue(fq, skb, fhdr, nhoff); if (ret < 0) { if (ret == -EPROTO) { skb->transport_header = savethdr; ret = 0; } goto out_unlock; } Loading Loading
net/ipv6/netfilter/nf_conntrack_reasm.c +10 −5 Original line number Diff line number Diff line Loading @@ -230,7 +230,7 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, if ((unsigned int)end > IPV6_MAXPLEN) { pr_debug("offset is too large.\n"); return -1; return -EINVAL; } ecn = ip6_frag_ecn(ipv6_hdr(skb)); Loading Loading @@ -263,7 +263,7 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, * this case. -DaveM */ pr_debug("end of fragment not rounded to 8 bytes.\n"); return -1; return -EPROTO; } if (end > fq->q.len) { /* Some bits beyond end -> corruption. */ Loading Loading @@ -357,7 +357,7 @@ static int nf_ct_frag6_queue(struct frag_queue *fq, struct sk_buff *skb, discard_fq: inet_frag_kill(&fq->q, &nf_frags); err: return -1; return -EINVAL; } /* Loading Loading @@ -566,6 +566,7 @@ find_prev_fhdr(struct sk_buff *skb, u8 *prevhdrp, int *prevhoff, int *fhoff) int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user) { u16 savethdr = skb->transport_header; struct net_device *dev = skb->dev; int fhoff, nhoff, ret; struct frag_hdr *fhdr; Loading Loading @@ -599,8 +600,12 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user) spin_lock_bh(&fq->q.lock); if (nf_ct_frag6_queue(fq, skb, fhdr, nhoff) < 0) { ret = -EINVAL; ret = nf_ct_frag6_queue(fq, skb, fhdr, nhoff); if (ret < 0) { if (ret == -EPROTO) { skb->transport_header = savethdr; ret = 0; } goto out_unlock; } Loading