Skip to content

Commit e639397

Browse files
edumazetgregkh
authored andcommitted
tcp: annotate data-races around icsk->icsk_syn_retries
[ Upstream commit 3a037f0 ] 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]> Signed-off-by: Sasha Levin <[email protected]>
1 parent d27a1aa commit e639397

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
@@ -1016,7 +1016,7 @@ static void reqsk_timer_handler(struct timer_list *t)
10161016

10171017
icsk = inet_csk(sk_listener);
10181018
net = sock_net(sk_listener);
1019-
max_syn_ack_retries = icsk->icsk_syn_retries ? :
1019+
max_syn_ack_retries = READ_ONCE(icsk->icsk_syn_retries) ? :
10201020
READ_ONCE(net->ipv4.sysctl_tcp_synack_retries);
10211021
/* Normally all the openreqs are young and become mature
10221022
* (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
@@ -3397,7 +3397,7 @@ int tcp_sock_set_syncnt(struct sock *sk, int val)
33973397
return -EINVAL;
33983398

33993399
lock_sock(sk);
3400-
inet_csk(sk)->icsk_syn_retries = val;
3400+
WRITE_ONCE(inet_csk(sk)->icsk_syn_retries, val);
34013401
release_sock(sk);
34023402
return 0;
34033403
}
@@ -3678,7 +3678,7 @@ int do_tcp_setsockopt(struct sock *sk, int level, int optname,
36783678
if (val < 1 || val > MAX_TCP_SYNCNT)
36793679
err = -EINVAL;
36803680
else
3681-
icsk->icsk_syn_retries = val;
3681+
WRITE_ONCE(icsk->icsk_syn_retries, val);
36823682
break;
36833683

36843684
case TCP_SAVE_SYN:
@@ -4095,7 +4095,7 @@ int do_tcp_getsockopt(struct sock *sk, int level,
40954095
val = keepalive_probes(tp);
40964096
break;
40974097
case TCP_SYNCNT:
4098-
val = icsk->icsk_syn_retries ? :
4098+
val = READ_ONCE(icsk->icsk_syn_retries) ? :
40994099
READ_ONCE(net->ipv4.sysctl_tcp_syn_retries);
41004100
break;
41014101
case TCP_LINGER2:

0 commit comments

Comments
 (0)