diff options
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 24 | 
1 files changed, 13 insertions, 11 deletions
| diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index a6079e7a6c6b..108b39967694 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -976,6 +976,16 @@ drop:  	return 0; /* don't send reset */  } +static void tcp_v6_restore_cb(struct sk_buff *skb) +{ +	/* We need to move header back to the beginning if xfrm6_policy_check() +	 * and tcp_v6_fill_cb() are going to be called again. +	 * ip6_datagram_recv_specific_ctl() also expects IP6CB to be there. +	 */ +	memmove(IP6CB(skb), &TCP_SKB_CB(skb)->header.h6, +		sizeof(struct inet6_skb_parm)); +} +  static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,  					 struct request_sock *req,  					 struct dst_entry *dst, @@ -1165,8 +1175,10 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *  						      sk_gfp_atomic(sk, GFP_ATOMIC));  			consume_skb(ireq->pktopts);  			ireq->pktopts = NULL; -			if (newnp->pktoptions) +			if (newnp->pktoptions) { +				tcp_v6_restore_cb(newnp->pktoptions);  				skb_set_owner_r(newnp->pktoptions, newsk); +			}  		}  	} @@ -1181,16 +1193,6 @@ out:  	return NULL;  } -static void tcp_v6_restore_cb(struct sk_buff *skb) -{ -	/* We need to move header back to the beginning if xfrm6_policy_check() -	 * and tcp_v6_fill_cb() are going to be called again. -	 * ip6_datagram_recv_specific_ctl() also expects IP6CB to be there. -	 */ -	memmove(IP6CB(skb), &TCP_SKB_CB(skb)->header.h6, -		sizeof(struct inet6_skb_parm)); -} -  /* The socket must have it's spinlock held when we get   * here, unless it is a TCP_LISTEN socket.   * | 
