diff options
Diffstat (limited to 'net/ipv4/tcp_minisocks.c')
| -rw-r--r-- | net/ipv4/tcp_minisocks.c | 12 | 
1 files changed, 7 insertions, 5 deletions
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index 66363b689ad..550e755747e 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c @@ -336,15 +336,15 @@ void tcp_time_wait(struct sock *sk, int state, int timeo)  		tcptw->tw_ts_recent	= tp->rx_opt.ts_recent;  		tcptw->tw_ts_recent_stamp = tp->rx_opt.ts_recent_stamp; -#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) +#if IS_ENABLED(CONFIG_IPV6)  		if (tw->tw_family == PF_INET6) {  			struct ipv6_pinfo *np = inet6_sk(sk);  			struct inet6_timewait_sock *tw6;  			tw->tw_ipv6_offset = inet6_tw_offset(sk->sk_prot);  			tw6 = inet6_twsk((struct sock *)tw); -			ipv6_addr_copy(&tw6->tw_v6_daddr, &np->daddr); -			ipv6_addr_copy(&tw6->tw_v6_rcv_saddr, &np->rcv_saddr); +			tw6->tw_v6_daddr = np->daddr; +			tw6->tw_v6_rcv_saddr = np->rcv_saddr;  			tw->tw_tclass = np->tclass;  			tw->tw_ipv6only = np->ipv6only;  		} @@ -425,7 +425,7 @@ static inline void TCP_ECN_openreq_child(struct tcp_sock *tp,   */  struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, struct sk_buff *skb)  { -	struct sock *newsk = inet_csk_clone(sk, req, GFP_ATOMIC); +	struct sock *newsk = inet_csk_clone_lock(sk, req, GFP_ATOMIC);  	if (newsk != NULL) {  		const struct inet_request_sock *ireq = inet_rsk(req); @@ -495,7 +495,9 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req,  		newtp->frto_counter = 0;  		newtp->frto_highmark = 0; -		newicsk->icsk_ca_ops = &tcp_init_congestion_ops; +		if (newicsk->icsk_ca_ops != &tcp_init_congestion_ops && +		    !try_module_get(newicsk->icsk_ca_ops->owner)) +			newicsk->icsk_ca_ops = &tcp_init_congestion_ops;  		tcp_set_ca_state(newsk, TCP_CA_Open);  		tcp_init_xmit_timers(newsk);  |