forked from luck/tmp_suning_uos_patched
tcp: Fix data-races around sysctl_tcp_reflect_tos.
[ Upstream commit 870e3a634b6a6cb1543b359007aca73fe6a03ac5 ]
While reading sysctl_tcp_reflect_tos, it can be changed concurrently.
Thus, we need to add READ_ONCE() to its readers.
Fixes: ac8f1710c1
("tcp: reflect tos value received in SYN to the socket")
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Acked-by: Wei Wang <weiwan@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
f310fb69a0
commit
e4a7acd6b4
|
@ -983,7 +983,7 @@ static int tcp_v4_send_synack(const struct sock *sk, struct dst_entry *dst,
|
||||||
if (skb) {
|
if (skb) {
|
||||||
__tcp_v4_send_check(skb, ireq->ir_loc_addr, ireq->ir_rmt_addr);
|
__tcp_v4_send_check(skb, ireq->ir_loc_addr, ireq->ir_rmt_addr);
|
||||||
|
|
||||||
tos = sock_net(sk)->ipv4.sysctl_tcp_reflect_tos ?
|
tos = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_reflect_tos) ?
|
||||||
(tcp_rsk(req)->syn_tos & ~INET_ECN_MASK) |
|
(tcp_rsk(req)->syn_tos & ~INET_ECN_MASK) |
|
||||||
(inet_sk(sk)->tos & INET_ECN_MASK) :
|
(inet_sk(sk)->tos & INET_ECN_MASK) :
|
||||||
inet_sk(sk)->tos;
|
inet_sk(sk)->tos;
|
||||||
|
@ -1558,7 +1558,7 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb,
|
||||||
/* Set ToS of the new socket based upon the value of incoming SYN.
|
/* Set ToS of the new socket based upon the value of incoming SYN.
|
||||||
* ECT bits are set later in tcp_init_transfer().
|
* ECT bits are set later in tcp_init_transfer().
|
||||||
*/
|
*/
|
||||||
if (sock_net(sk)->ipv4.sysctl_tcp_reflect_tos)
|
if (READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_reflect_tos))
|
||||||
newinet->tos = tcp_rsk(req)->syn_tos & ~INET_ECN_MASK;
|
newinet->tos = tcp_rsk(req)->syn_tos & ~INET_ECN_MASK;
|
||||||
|
|
||||||
if (!dst) {
|
if (!dst) {
|
||||||
|
|
|
@ -542,7 +542,7 @@ static int tcp_v6_send_synack(const struct sock *sk, struct dst_entry *dst,
|
||||||
if (np->repflow && ireq->pktopts)
|
if (np->repflow && ireq->pktopts)
|
||||||
fl6->flowlabel = ip6_flowlabel(ipv6_hdr(ireq->pktopts));
|
fl6->flowlabel = ip6_flowlabel(ipv6_hdr(ireq->pktopts));
|
||||||
|
|
||||||
tclass = sock_net(sk)->ipv4.sysctl_tcp_reflect_tos ?
|
tclass = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_reflect_tos) ?
|
||||||
(tcp_rsk(req)->syn_tos & ~INET_ECN_MASK) |
|
(tcp_rsk(req)->syn_tos & ~INET_ECN_MASK) |
|
||||||
(np->tclass & INET_ECN_MASK) :
|
(np->tclass & INET_ECN_MASK) :
|
||||||
np->tclass;
|
np->tclass;
|
||||||
|
@ -1344,7 +1344,7 @@ static struct sock *tcp_v6_syn_recv_sock(const struct sock *sk, struct sk_buff *
|
||||||
/* Set ToS of the new socket based upon the value of incoming SYN.
|
/* Set ToS of the new socket based upon the value of incoming SYN.
|
||||||
* ECT bits are set later in tcp_init_transfer().
|
* ECT bits are set later in tcp_init_transfer().
|
||||||
*/
|
*/
|
||||||
if (sock_net(sk)->ipv4.sysctl_tcp_reflect_tos)
|
if (READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_reflect_tos))
|
||||||
newnp->tclass = tcp_rsk(req)->syn_tos & ~INET_ECN_MASK;
|
newnp->tclass = tcp_rsk(req)->syn_tos & ~INET_ECN_MASK;
|
||||||
|
|
||||||
/* Clone native IPv6 options from listening socket (if any)
|
/* Clone native IPv6 options from listening socket (if any)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user