Skip to content

Commit 3666f66

Browse files
q2vendavem330
authored andcommitted
tcp: Fix data-races around sysctl knobs related to SYN option.
While reading these knobs, they can be changed concurrently. Thus, we need to add READ_ONCE() to their readers. - tcp_sack - tcp_window_scaling - tcp_timestamps Fixes: 1da177e ("Linux-2.6.12-rc2") Signed-off-by: Kuniyuki Iwashima <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 3d72bb4 commit 3666f66

File tree

5 files changed

+16
-16
lines changed

5 files changed

+16
-16
lines changed

drivers/net/ethernet/chelsio/inline_crypto/chtls/chtls_cm.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1236,8 +1236,8 @@ static struct sock *chtls_recv_sock(struct sock *lsk,
12361236
csk->sndbuf = newsk->sk_sndbuf;
12371237
csk->smac_idx = ((struct port_info *)netdev_priv(ndev))->smt_idx;
12381238
RCV_WSCALE(tp) = select_rcv_wscale(tcp_full_space(newsk),
1239-
sock_net(newsk)->
1240-
ipv4.sysctl_tcp_window_scaling,
1239+
READ_ONCE(sock_net(newsk)->
1240+
ipv4.sysctl_tcp_window_scaling),
12411241
tp->window_clamp);
12421242
neigh_release(n);
12431243
inet_inherit_port(&tcp_hashinfo, lsk, newsk);
@@ -1384,7 +1384,7 @@ static void chtls_pass_accept_request(struct sock *sk,
13841384
#endif
13851385
}
13861386
if (req->tcpopt.wsf <= 14 &&
1387-
sock_net(sk)->ipv4.sysctl_tcp_window_scaling) {
1387+
READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_window_scaling)) {
13881388
inet_rsk(oreq)->wscale_ok = 1;
13891389
inet_rsk(oreq)->snd_wscale = req->tcpopt.wsf;
13901390
}

net/core/secure_seq.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ u32 secure_tcpv6_ts_off(const struct net *net,
6464
.daddr = *(struct in6_addr *)daddr,
6565
};
6666

67-
if (net->ipv4.sysctl_tcp_timestamps != 1)
67+
if (READ_ONCE(net->ipv4.sysctl_tcp_timestamps) != 1)
6868
return 0;
6969

7070
ts_secret_init();
@@ -120,7 +120,7 @@ EXPORT_SYMBOL(secure_ipv6_port_ephemeral);
120120
#ifdef CONFIG_INET
121121
u32 secure_tcp_ts_off(const struct net *net, __be32 saddr, __be32 daddr)
122122
{
123-
if (net->ipv4.sysctl_tcp_timestamps != 1)
123+
if (READ_ONCE(net->ipv4.sysctl_tcp_timestamps) != 1)
124124
return 0;
125125

126126
ts_secret_init();

net/ipv4/syncookies.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,12 @@ bool cookie_timestamp_decode(const struct net *net,
247247
return true;
248248
}
249249

250-
if (!net->ipv4.sysctl_tcp_timestamps)
250+
if (!READ_ONCE(net->ipv4.sysctl_tcp_timestamps))
251251
return false;
252252

253253
tcp_opt->sack_ok = (options & TS_OPT_SACK) ? TCP_SACK_SEEN : 0;
254254

255-
if (tcp_opt->sack_ok && !net->ipv4.sysctl_tcp_sack)
255+
if (tcp_opt->sack_ok && !READ_ONCE(net->ipv4.sysctl_tcp_sack))
256256
return false;
257257

258258
if ((options & TS_OPT_WSCALE_MASK) == TS_OPT_WSCALE_MASK)
@@ -261,7 +261,7 @@ bool cookie_timestamp_decode(const struct net *net,
261261
tcp_opt->wscale_ok = 1;
262262
tcp_opt->snd_wscale = options & TS_OPT_WSCALE_MASK;
263263

264-
return net->ipv4.sysctl_tcp_window_scaling != 0;
264+
return READ_ONCE(net->ipv4.sysctl_tcp_window_scaling) != 0;
265265
}
266266
EXPORT_SYMBOL(cookie_timestamp_decode);
267267

net/ipv4/tcp_input.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4060,7 +4060,7 @@ void tcp_parse_options(const struct net *net,
40604060
break;
40614061
case TCPOPT_WINDOW:
40624062
if (opsize == TCPOLEN_WINDOW && th->syn &&
4063-
!estab && net->ipv4.sysctl_tcp_window_scaling) {
4063+
!estab && READ_ONCE(net->ipv4.sysctl_tcp_window_scaling)) {
40644064
__u8 snd_wscale = *(__u8 *)ptr;
40654065
opt_rx->wscale_ok = 1;
40664066
if (snd_wscale > TCP_MAX_WSCALE) {
@@ -4076,15 +4076,15 @@ void tcp_parse_options(const struct net *net,
40764076
case TCPOPT_TIMESTAMP:
40774077
if ((opsize == TCPOLEN_TIMESTAMP) &&
40784078
((estab && opt_rx->tstamp_ok) ||
4079-
(!estab && net->ipv4.sysctl_tcp_timestamps))) {
4079+
(!estab && READ_ONCE(net->ipv4.sysctl_tcp_timestamps)))) {
40804080
opt_rx->saw_tstamp = 1;
40814081
opt_rx->rcv_tsval = get_unaligned_be32(ptr);
40824082
opt_rx->rcv_tsecr = get_unaligned_be32(ptr + 4);
40834083
}
40844084
break;
40854085
case TCPOPT_SACK_PERM:
40864086
if (opsize == TCPOLEN_SACK_PERM && th->syn &&
4087-
!estab && net->ipv4.sysctl_tcp_sack) {
4087+
!estab && READ_ONCE(net->ipv4.sysctl_tcp_sack)) {
40884088
opt_rx->sack_ok = TCP_SACK_SEEN;
40894089
tcp_sack_reset(opt_rx);
40904090
}

net/ipv4/tcp_output.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -791,18 +791,18 @@ static unsigned int tcp_syn_options(struct sock *sk, struct sk_buff *skb,
791791
opts->mss = tcp_advertise_mss(sk);
792792
remaining -= TCPOLEN_MSS_ALIGNED;
793793

794-
if (likely(sock_net(sk)->ipv4.sysctl_tcp_timestamps && !*md5)) {
794+
if (likely(READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_timestamps) && !*md5)) {
795795
opts->options |= OPTION_TS;
796796
opts->tsval = tcp_skb_timestamp(skb) + tp->tsoffset;
797797
opts->tsecr = tp->rx_opt.ts_recent;
798798
remaining -= TCPOLEN_TSTAMP_ALIGNED;
799799
}
800-
if (likely(sock_net(sk)->ipv4.sysctl_tcp_window_scaling)) {
800+
if (likely(READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_window_scaling))) {
801801
opts->ws = tp->rx_opt.rcv_wscale;
802802
opts->options |= OPTION_WSCALE;
803803
remaining -= TCPOLEN_WSCALE_ALIGNED;
804804
}
805-
if (likely(sock_net(sk)->ipv4.sysctl_tcp_sack)) {
805+
if (likely(READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_sack))) {
806806
opts->options |= OPTION_SACK_ADVERTISE;
807807
if (unlikely(!(OPTION_TS & opts->options)))
808808
remaining -= TCPOLEN_SACKPERM_ALIGNED;
@@ -3647,7 +3647,7 @@ static void tcp_connect_init(struct sock *sk)
36473647
* See tcp_input.c:tcp_rcv_state_process case TCP_SYN_SENT.
36483648
*/
36493649
tp->tcp_header_len = sizeof(struct tcphdr);
3650-
if (sock_net(sk)->ipv4.sysctl_tcp_timestamps)
3650+
if (READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_timestamps))
36513651
tp->tcp_header_len += TCPOLEN_TSTAMP_ALIGNED;
36523652

36533653
#ifdef CONFIG_TCP_MD5SIG
@@ -3683,7 +3683,7 @@ static void tcp_connect_init(struct sock *sk)
36833683
tp->advmss - (tp->rx_opt.ts_recent_stamp ? tp->tcp_header_len - sizeof(struct tcphdr) : 0),
36843684
&tp->rcv_wnd,
36853685
&tp->window_clamp,
3686-
sock_net(sk)->ipv4.sysctl_tcp_window_scaling,
3686+
READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_window_scaling),
36873687
&rcv_wscale,
36883688
rcv_wnd);
36893689

0 commit comments

Comments
 (0)