diff options
| -rw-r--r-- | net/ipv4/xfrm4_mode_beet.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/net/ipv4/xfrm4_mode_beet.c b/net/ipv4/xfrm4_mode_beet.c index b94775a86863..f68dfd8a0f5c 100644 --- a/net/ipv4/xfrm4_mode_beet.c +++ b/net/ipv4/xfrm4_mode_beet.c | |||
| @@ -78,10 +78,11 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 78 | protocol = iph->protocol; | 78 | protocol = iph->protocol; |
| 79 | 79 | ||
| 80 | if (unlikely(iph->protocol == IPPROTO_BEETPH)) { | 80 | if (unlikely(iph->protocol == IPPROTO_BEETPH)) { |
| 81 | struct ip_beet_phdr *ph = (struct ip_beet_phdr*)(iph + 1); | 81 | struct ip_beet_phdr *ph; |
| 82 | 82 | ||
| 83 | if (!pskb_may_pull(skb, sizeof(*ph))) | 83 | if (!pskb_may_pull(skb, sizeof(*ph))) |
| 84 | goto out; | 84 | goto out; |
| 85 | ph = (struct ip_beet_phdr *)(skb->h.ipiph + 1); | ||
| 85 | 86 | ||
| 86 | phlen = sizeof(*ph) + ph->padlen; | 87 | phlen = sizeof(*ph) + ph->padlen; |
| 87 | optlen = ph->hdrlen * 8 - phlen; | 88 | optlen = ph->hdrlen * 8 - phlen; |
| @@ -90,6 +91,7 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 90 | 91 | ||
| 91 | if (!pskb_may_pull(skb, phlen + optlen)) | 92 | if (!pskb_may_pull(skb, phlen + optlen)) |
| 92 | goto out; | 93 | goto out; |
| 94 | skb->len -= phlen + optlen; | ||
| 93 | 95 | ||
| 94 | ph_nexthdr = ph->nexthdr; | 96 | ph_nexthdr = ph->nexthdr; |
| 95 | } | 97 | } |
| @@ -97,6 +99,7 @@ static int xfrm4_beet_input(struct xfrm_state *x, struct sk_buff *skb) | |||
| 97 | skb->nh.raw = skb->data + (phlen - sizeof(*iph)); | 99 | skb->nh.raw = skb->data + (phlen - sizeof(*iph)); |
| 98 | memmove(skb->nh.raw, iph, sizeof(*iph)); | 100 | memmove(skb->nh.raw, iph, sizeof(*iph)); |
| 99 | skb->h.raw = skb->data + (phlen + optlen); | 101 | skb->h.raw = skb->data + (phlen + optlen); |
| 102 | skb->data = skb->h.raw; | ||
| 100 | 103 | ||
| 101 | iph = skb->nh.iph; | 104 | iph = skb->nh.iph; |
| 102 | iph->ihl = (sizeof(*iph) + optlen) / 4; | 105 | iph->ihl = (sizeof(*iph) + optlen) / 4; |
