mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 19:56:18 +00:00
[IPCOMP]: Fetch nexthdr before ipch is destroyed
When I moved the nexthdr setting out of IPComp I accidently moved the reading of ipch->nexthdr after the decompression. Unfortunately this means that we'd be reading from a stale ipch pointer which doesn't work very well. This patch moves the reading up so that we get the correct nexthdr value. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
936f6f8e1b
commit
2614fa59fa
2 changed files with 8 additions and 2 deletions
|
@ -74,6 +74,7 @@ out:
|
|||
|
||||
static int ipcomp_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
{
|
||||
int nexthdr;
|
||||
int err = -ENOMEM;
|
||||
struct ip_comp_hdr *ipch;
|
||||
|
||||
|
@ -84,13 +85,15 @@ static int ipcomp_input(struct xfrm_state *x, struct sk_buff *skb)
|
|||
|
||||
/* Remove ipcomp header and decompress original payload */
|
||||
ipch = (void *)skb->data;
|
||||
nexthdr = ipch->nexthdr;
|
||||
|
||||
skb->transport_header = skb->network_header + sizeof(*ipch);
|
||||
__skb_pull(skb, sizeof(*ipch));
|
||||
err = ipcomp_decompress(x, skb);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
err = ipch->nexthdr;
|
||||
err = nexthdr;
|
||||
|
||||
out:
|
||||
return err;
|
||||
|
|
|
@ -64,6 +64,7 @@ static LIST_HEAD(ipcomp6_tfms_list);
|
|||
|
||||
static int ipcomp6_input(struct xfrm_state *x, struct sk_buff *skb)
|
||||
{
|
||||
int nexthdr;
|
||||
int err = -ENOMEM;
|
||||
struct ip_comp_hdr *ipch;
|
||||
int plen, dlen;
|
||||
|
@ -79,6 +80,8 @@ static int ipcomp6_input(struct xfrm_state *x, struct sk_buff *skb)
|
|||
|
||||
/* Remove ipcomp header and decompress original payload */
|
||||
ipch = (void *)skb->data;
|
||||
nexthdr = ipch->nexthdr;
|
||||
|
||||
skb->transport_header = skb->network_header + sizeof(*ipch);
|
||||
__skb_pull(skb, sizeof(*ipch));
|
||||
|
||||
|
@ -108,7 +111,7 @@ static int ipcomp6_input(struct xfrm_state *x, struct sk_buff *skb)
|
|||
skb->truesize += dlen - plen;
|
||||
__skb_put(skb, dlen - plen);
|
||||
skb_copy_to_linear_data(skb, scratch, dlen);
|
||||
err = ipch->nexthdr;
|
||||
err = nexthdr;
|
||||
|
||||
out_put_cpu:
|
||||
put_cpu();
|
||||
|
|
Loading…
Reference in a new issue