diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
| -rw-r--r-- | net/ipv4/tcp_ipv4.c | 30 | 
1 files changed, 17 insertions, 13 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index bf124b1742df..6be568334848 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -164,9 +164,11 @@ int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp)  		 * without appearing to create any others.  		 */  		if (likely(!tp->repair)) { -			tp->write_seq = tcptw->tw_snd_nxt + 65535 + 2; -			if (tp->write_seq == 0) -				tp->write_seq = 1; +			u32 seq = tcptw->tw_snd_nxt + 65535 + 2; + +			if (!seq) +				seq = 1; +			WRITE_ONCE(tp->write_seq, seq);  			tp->rx_opt.ts_recent	   = tcptw->tw_ts_recent;  			tp->rx_opt.ts_recent_stamp = tcptw->tw_ts_recent_stamp;  		} @@ -253,7 +255,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)  		tp->rx_opt.ts_recent	   = 0;  		tp->rx_opt.ts_recent_stamp = 0;  		if (likely(!tp->repair)) -			tp->write_seq	   = 0; +			WRITE_ONCE(tp->write_seq, 0);  	}  	inet->inet_dport = usin->sin_port; @@ -291,10 +293,11 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)  	if (likely(!tp->repair)) {  		if (!tp->write_seq) -			tp->write_seq = secure_tcp_seq(inet->inet_saddr, -						       inet->inet_daddr, -						       inet->inet_sport, -						       usin->sin_port); +			WRITE_ONCE(tp->write_seq, +				   secure_tcp_seq(inet->inet_saddr, +						  inet->inet_daddr, +						  inet->inet_sport, +						  usin->sin_port));  		tp->tsoffset = secure_tcp_ts_off(sock_net(sk),  						 inet->inet_saddr,  						 inet->inet_daddr); @@ -478,7 +481,7 @@ int tcp_v4_err(struct sk_buff *icmp_skb, u32 info)  	icsk = inet_csk(sk);  	tp = tcp_sk(sk);  	/* XXX (TFO) - tp->snd_una should be ISN (tcp_create_openreq_child() */ -	fastopen = tp->fastopen_rsk; +	fastopen = rcu_dereference(tp->fastopen_rsk);  	snd_una = fastopen ? tcp_rsk(fastopen)->snt_isn : tp->snd_una;  	if (sk->sk_state != TCP_LISTEN &&  	    !between(seq, snd_una, tp->snd_nxt)) { @@ -1644,7 +1647,7 @@ int tcp_v4_early_demux(struct sk_buff *skb)  bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb)  { -	u32 limit = sk->sk_rcvbuf + sk->sk_sndbuf; +	u32 limit = READ_ONCE(sk->sk_rcvbuf) + READ_ONCE(sk->sk_sndbuf);  	struct skb_shared_info *shinfo;  	const struct tcphdr *th;  	struct tcphdr *thtail; @@ -2121,7 +2124,7 @@ void tcp_v4_destroy_sock(struct sock *sk)  	if (inet_csk(sk)->icsk_bind_hash)  		inet_put_port(sk); -	BUG_ON(tp->fastopen_rsk); +	BUG_ON(rcu_access_pointer(tp->fastopen_rsk));  	/* If socket is aborted during connect operation */  	tcp_free_fastopen_req(tp); @@ -2455,12 +2458,13 @@ static void get_tcp4_sock(struct sock *sk, struct seq_file *f, int i)  		/* Because we don't lock the socket,  		 * we might find a transient negative value.  		 */ -		rx_queue = max_t(int, tp->rcv_nxt - tp->copied_seq, 0); +		rx_queue = max_t(int, READ_ONCE(tp->rcv_nxt) - +				      READ_ONCE(tp->copied_seq), 0);  	seq_printf(f, "%4d: %08X:%04X %08X:%04X %02X %08X:%08X %02X:%08lX "  			"%08X %5u %8d %lu %d %pK %lu %lu %u %u %d",  		i, src, srcp, dest, destp, state, -		tp->write_seq - tp->snd_una, +		READ_ONCE(tp->write_seq) - tp->snd_una,  		rx_queue,  		timer_active,  		jiffies_delta_to_clock_t(timer_expires - jiffies),  | 
