mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
ipv6: annotate data-races around cnf.hop_limit
idev->cnf.hop_limit and net->ipv6.devconf_all->hop_limit might be read locklessly, add appropriate READ_ONCE() and WRITE_ONCE() annotations. Signed-off-by: Eric Dumazet <edumazet@google.com> Acked-by: Florian Westphal <fw@strlen.de> # for netfilter parts Reviewed-by: Jiri Pirko <jiri@nvidia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e7135f4849
commit
e0bb2675fe
@ -460,7 +460,7 @@ nfp_fl_set_tun(struct nfp_app *app, struct nfp_fl_set_tun *set_tun,
|
||||
set_tun->ttl = ip6_dst_hoplimit(dst);
|
||||
dst_release(dst);
|
||||
} else {
|
||||
set_tun->ttl = net->ipv6.devconf_all->hop_limit;
|
||||
set_tun->ttl = READ_ONCE(net->ipv6.devconf_all->hop_limit);
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
|
@ -1346,7 +1346,7 @@ int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
|
||||
}
|
||||
|
||||
if (val < 0)
|
||||
val = sock_net(sk)->ipv6.devconf_all->hop_limit;
|
||||
val = READ_ONCE(sock_net(sk)->ipv6.devconf_all->hop_limit);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1423,7 +1423,7 @@ static enum skb_drop_reason ndisc_router_discovery(struct sk_buff *skb)
|
||||
if (in6_dev->cnf.accept_ra_min_hop_limit < 256 &&
|
||||
ra_msg->icmph.icmp6_hop_limit) {
|
||||
if (in6_dev->cnf.accept_ra_min_hop_limit <= ra_msg->icmph.icmp6_hop_limit) {
|
||||
in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit;
|
||||
WRITE_ONCE(in6_dev->cnf.hop_limit, ra_msg->icmph.icmp6_hop_limit);
|
||||
fib6_metric_set(rt, RTAX_HOPLIMIT,
|
||||
ra_msg->icmph.icmp6_hop_limit);
|
||||
} else {
|
||||
|
@ -83,7 +83,7 @@ struct sk_buff *nf_reject_skb_v6_tcp_reset(struct net *net,
|
||||
|
||||
skb_reserve(nskb, LL_MAX_HEADER);
|
||||
nip6h = nf_reject_ip6hdr_put(nskb, oldskb, IPPROTO_TCP,
|
||||
net->ipv6.devconf_all->hop_limit);
|
||||
READ_ONCE(net->ipv6.devconf_all->hop_limit));
|
||||
nf_reject_ip6_tcphdr_put(nskb, oldskb, oth, otcplen);
|
||||
nip6h->payload_len = htons(nskb->len - sizeof(struct ipv6hdr));
|
||||
|
||||
@ -124,7 +124,7 @@ struct sk_buff *nf_reject_skb_v6_unreach(struct net *net,
|
||||
|
||||
skb_reserve(nskb, LL_MAX_HEADER);
|
||||
nip6h = nf_reject_ip6hdr_put(nskb, oldskb, IPPROTO_ICMPV6,
|
||||
net->ipv6.devconf_all->hop_limit);
|
||||
READ_ONCE(net->ipv6.devconf_all->hop_limit));
|
||||
|
||||
skb_reset_transport_header(nskb);
|
||||
icmp6h = skb_put_zero(nskb, sizeof(struct icmp6hdr));
|
||||
|
@ -111,9 +111,9 @@ int ip6_dst_hoplimit(struct dst_entry *dst)
|
||||
rcu_read_lock();
|
||||
idev = __in6_dev_get(dev);
|
||||
if (idev)
|
||||
hoplimit = idev->cnf.hop_limit;
|
||||
hoplimit = READ_ONCE(idev->cnf.hop_limit);
|
||||
else
|
||||
hoplimit = dev_net(dev)->ipv6.devconf_all->hop_limit;
|
||||
hoplimit = READ_ONCE(dev_net(dev)->ipv6.devconf_all->hop_limit);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
return hoplimit;
|
||||
|
@ -800,7 +800,7 @@ synproxy_build_ip_ipv6(struct net *net, struct sk_buff *skb,
|
||||
skb_reset_network_header(skb);
|
||||
iph = skb_put(skb, sizeof(*iph));
|
||||
ip6_flow_hdr(iph, 0, 0);
|
||||
iph->hop_limit = net->ipv6.devconf_all->hop_limit;
|
||||
iph->hop_limit = READ_ONCE(net->ipv6.devconf_all->hop_limit);
|
||||
iph->nexthdr = IPPROTO_TCP;
|
||||
iph->saddr = *saddr;
|
||||
iph->daddr = *daddr;
|
||||
|
Loading…
Reference in New Issue
Block a user