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 66363b689ad6..550e755747e0 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) | |||
336 | tcptw->tw_ts_recent = tp->rx_opt.ts_recent; | 336 | tcptw->tw_ts_recent = tp->rx_opt.ts_recent; |
337 | tcptw->tw_ts_recent_stamp = tp->rx_opt.ts_recent_stamp; | 337 | tcptw->tw_ts_recent_stamp = tp->rx_opt.ts_recent_stamp; |
338 | 338 | ||
339 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 339 | #if IS_ENABLED(CONFIG_IPV6) |
340 | if (tw->tw_family == PF_INET6) { | 340 | if (tw->tw_family == PF_INET6) { |
341 | struct ipv6_pinfo *np = inet6_sk(sk); | 341 | struct ipv6_pinfo *np = inet6_sk(sk); |
342 | struct inet6_timewait_sock *tw6; | 342 | struct inet6_timewait_sock *tw6; |
343 | 343 | ||
344 | tw->tw_ipv6_offset = inet6_tw_offset(sk->sk_prot); | 344 | tw->tw_ipv6_offset = inet6_tw_offset(sk->sk_prot); |
345 | tw6 = inet6_twsk((struct sock *)tw); | 345 | tw6 = inet6_twsk((struct sock *)tw); |
346 | ipv6_addr_copy(&tw6->tw_v6_daddr, &np->daddr); | 346 | tw6->tw_v6_daddr = np->daddr; |
347 | ipv6_addr_copy(&tw6->tw_v6_rcv_saddr, &np->rcv_saddr); | 347 | tw6->tw_v6_rcv_saddr = np->rcv_saddr; |
348 | tw->tw_tclass = np->tclass; | 348 | tw->tw_tclass = np->tclass; |
349 | tw->tw_ipv6only = np->ipv6only; | 349 | tw->tw_ipv6only = np->ipv6only; |
350 | } | 350 | } |
@@ -425,7 +425,7 @@ static inline void TCP_ECN_openreq_child(struct tcp_sock *tp, | |||
425 | */ | 425 | */ |
426 | struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, struct sk_buff *skb) | 426 | struct sock *tcp_create_openreq_child(struct sock *sk, struct request_sock *req, struct sk_buff *skb) |
427 | { | 427 | { |
428 | struct sock *newsk = inet_csk_clone(sk, req, GFP_ATOMIC); | 428 | struct sock *newsk = inet_csk_clone_lock(sk, req, GFP_ATOMIC); |
429 | 429 | ||
430 | if (newsk != NULL) { | 430 | if (newsk != NULL) { |
431 | const struct inet_request_sock *ireq = inet_rsk(req); | 431 | 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, | |||
495 | newtp->frto_counter = 0; | 495 | newtp->frto_counter = 0; |
496 | newtp->frto_highmark = 0; | 496 | newtp->frto_highmark = 0; |
497 | 497 | ||
498 | newicsk->icsk_ca_ops = &tcp_init_congestion_ops; | 498 | if (newicsk->icsk_ca_ops != &tcp_init_congestion_ops && |
499 | !try_module_get(newicsk->icsk_ca_ops->owner)) | ||
500 | newicsk->icsk_ca_ops = &tcp_init_congestion_ops; | ||
499 | 501 | ||
500 | tcp_set_ca_state(newsk, TCP_CA_Open); | 502 | tcp_set_ca_state(newsk, TCP_CA_Open); |
501 | tcp_init_xmit_timers(newsk); | 503 | tcp_init_xmit_timers(newsk); |