Skip to content

Commit 3a037f0

Browse files
edumazetkuba-moo
authored andcommitted
tcp: annotate data-races around icsk->icsk_syn_retries
do_tcp_getsockopt() and reqsk_timer_handler() read icsk->icsk_syn_retries while another cpu might change its value. Fixes: 1da177e ("Linux-2.6.12-rc2") Signed-off-by: Eric Dumazet <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent 6e5e1de commit 3a037f0

File tree

2 files changed

+4
-4
lines changed

2 files changed

+4
-4
lines changed

net/ipv4/inet_connection_sock.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1019,7 +1019,7 @@ static void reqsk_timer_handler(struct timer_list *t)
10191019

10201020
icsk = inet_csk(sk_listener);
10211021
net = sock_net(sk_listener);
1022-
max_syn_ack_retries = icsk->icsk_syn_retries ? :
1022+
max_syn_ack_retries = READ_ONCE(icsk->icsk_syn_retries) ? :
10231023
READ_ONCE(net->ipv4.sysctl_tcp_synack_retries);
10241024
/* Normally all the openreqs are young and become mature
10251025
* (i.e. converted to established socket) for first timeout.

net/ipv4/tcp.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3291,7 +3291,7 @@ int tcp_sock_set_syncnt(struct sock *sk, int val)
32913291
return -EINVAL;
32923292

32933293
lock_sock(sk);
3294-
inet_csk(sk)->icsk_syn_retries = val;
3294+
WRITE_ONCE(inet_csk(sk)->icsk_syn_retries, val);
32953295
release_sock(sk);
32963296
return 0;
32973297
}
@@ -3572,7 +3572,7 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
35723572
if (val < 1 || val > MAX_TCP_SYNCNT)
35733573
err = -EINVAL;
35743574
else
3575-
icsk->icsk_syn_retries = val;
3575+
WRITE_ONCE(icsk->icsk_syn_retries, val);
35763576
break;
35773577

35783578
case TCP_SAVE_SYN:
@@ -3993,7 +3993,7 @@ int do_tcp_getsockopt(struct sock *sk, int level,
39933993
val = keepalive_probes(tp);
39943994
break;
39953995
case TCP_SYNCNT:
3996-
val = icsk->icsk_syn_retries ? :
3996+
val = READ_ONCE(icsk->icsk_syn_retries) ? :
39973997
READ_ONCE(net->ipv4.sysctl_tcp_syn_retries);
39983998
break;
39993999
case TCP_LINGER2:

0 commit comments

Comments
 (0)