diff options
Diffstat (limited to 'net/ipv6/ah6.c')
-rw-r--r-- | net/ipv6/ah6.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/net/ipv6/ah6.c b/net/ipv6/ah6.c index ecc35b93314b..bb02e176cb70 100644 --- a/net/ipv6/ah6.c +++ b/net/ipv6/ah6.c | |||
@@ -472,7 +472,10 @@ static void ah6_input_done(struct crypto_async_request *base, int err) | |||
472 | skb->network_header += ah_hlen; | 472 | skb->network_header += ah_hlen; |
473 | memcpy(skb_network_header(skb), work_iph, hdr_len); | 473 | memcpy(skb_network_header(skb), work_iph, hdr_len); |
474 | __skb_pull(skb, ah_hlen + hdr_len); | 474 | __skb_pull(skb, ah_hlen + hdr_len); |
475 | skb_set_transport_header(skb, -hdr_len); | 475 | if (x->props.mode == XFRM_MODE_TUNNEL) |
476 | skb_reset_transport_header(skb); | ||
477 | else | ||
478 | skb_set_transport_header(skb, -hdr_len); | ||
476 | out: | 479 | out: |
477 | kfree(AH_SKB_CB(skb)->tmp); | 480 | kfree(AH_SKB_CB(skb)->tmp); |
478 | xfrm_input_resume(skb, err); | 481 | xfrm_input_resume(skb, err); |
@@ -518,8 +521,7 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb) | |||
518 | 521 | ||
519 | /* We are going to _remove_ AH header to keep sockets happy, | 522 | /* We are going to _remove_ AH header to keep sockets happy, |
520 | * so... Later this can change. */ | 523 | * so... Later this can change. */ |
521 | if (skb_cloned(skb) && | 524 | if (skb_unclone(skb, GFP_ATOMIC)) |
522 | pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) | ||
523 | goto out; | 525 | goto out; |
524 | 526 | ||
525 | skb->ip_summed = CHECKSUM_NONE; | 527 | skb->ip_summed = CHECKSUM_NONE; |
@@ -593,9 +595,13 @@ static int ah6_input(struct xfrm_state *x, struct sk_buff *skb) | |||
593 | 595 | ||
594 | skb->network_header += ah_hlen; | 596 | skb->network_header += ah_hlen; |
595 | memcpy(skb_network_header(skb), work_iph, hdr_len); | 597 | memcpy(skb_network_header(skb), work_iph, hdr_len); |
596 | skb->transport_header = skb->network_header; | ||
597 | __skb_pull(skb, ah_hlen + hdr_len); | 598 | __skb_pull(skb, ah_hlen + hdr_len); |
598 | 599 | ||
600 | if (x->props.mode == XFRM_MODE_TUNNEL) | ||
601 | skb_reset_transport_header(skb); | ||
602 | else | ||
603 | skb_set_transport_header(skb, -hdr_len); | ||
604 | |||
599 | err = nexthdr; | 605 | err = nexthdr; |
600 | 606 | ||
601 | out_free: | 607 | out_free: |