Skip to content

Commit f27e76c

Browse files
edumazetsmb49
authored andcommitted
net: annotate data-races around sk->sk_priority
BugLink: https://bugs.launchpad.net/bugs/2038236 [ Upstream commit 8bf43be ] sk_getsockopt() runs locklessly. This means sk->sk_priority can be read while other threads are changing its value. Other reads also happen without socket lock being held. Add missing annotations where needed. Fixes: 1da177e ("Linux-2.6.12-rc2") Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org> Signed-off-by: Kamal Mostafa <kamal@canonical.com> Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
1 parent eee0a44 commit f27e76c

File tree

8 files changed

+14
-13
lines changed

8 files changed

+14
-13
lines changed

net/core/sock.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -800,7 +800,7 @@ EXPORT_SYMBOL(sock_no_linger);
800800
void sock_set_priority(struct sock *sk, u32 priority)
801801
{
802802
lock_sock(sk);
803-
sk->sk_priority = priority;
803+
WRITE_ONCE(sk->sk_priority, priority);
804804
release_sock(sk);
805805
}
806806
EXPORT_SYMBOL(sock_set_priority);
@@ -1210,7 +1210,7 @@ int sk_setsockopt(struct sock *sk, int level, int optname,
12101210
if ((val >= 0 && val <= 6) ||
12111211
sockopt_ns_capable(sock_net(sk)->user_ns, CAP_NET_RAW) ||
12121212
sockopt_ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))
1213-
sk->sk_priority = val;
1213+
WRITE_ONCE(sk->sk_priority, val);
12141214
else
12151215
ret = -EPERM;
12161216
break;
@@ -1677,7 +1677,7 @@ int sk_getsockopt(struct sock *sk, int level, int optname,
16771677
break;
16781678

16791679
case SO_PRIORITY:
1680-
v.val = sk->sk_priority;
1680+
v.val = READ_ONCE(sk->sk_priority);
16811681
break;
16821682

16831683
case SO_LINGER:

net/ipv4/ip_output.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ int ip_build_and_send_pkt(struct sk_buff *skb, const struct sock *sk,
182182
ip_options_build(skb, &opt->opt, daddr, rt);
183183
}
184184

185-
skb->priority = sk->sk_priority;
185+
skb->priority = READ_ONCE(sk->sk_priority);
186186
if (!skb->mark)
187187
skb->mark = READ_ONCE(sk->sk_mark);
188188

@@ -526,7 +526,7 @@ int __ip_queue_xmit(struct sock *sk, struct sk_buff *skb, struct flowi *fl,
526526
skb_shinfo(skb)->gso_segs ?: 1);
527527

528528
/* TODO : should we use skb->sk here instead of sk ? */
529-
skb->priority = sk->sk_priority;
529+
skb->priority = READ_ONCE(sk->sk_priority);
530530
skb->mark = READ_ONCE(sk->sk_mark);
531531

532532
res = ip_local_out(net, sk, skb);

net/ipv4/ip_sockglue.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ void __ip_sock_set_tos(struct sock *sk, int val)
594594
}
595595
if (inet_sk(sk)->tos != val) {
596596
inet_sk(sk)->tos = val;
597-
sk->sk_priority = rt_tos2priority(val);
597+
WRITE_ONCE(sk->sk_priority, rt_tos2priority(val));
598598
sk_dst_reset(sk);
599599
}
600600
}

net/ipv4/raw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ static int raw_send_hdrinc(struct sock *sk, struct flowi4 *fl4,
346346
goto error;
347347
skb_reserve(skb, hlen);
348348

349-
skb->priority = sk->sk_priority;
349+
skb->priority = READ_ONCE(sk->sk_priority);
350350
skb->mark = sockc->mark;
351351
skb->tstamp = sockc->transmit_time;
352352
skb_dst_set(skb, &rt->dst);

net/ipv4/tcp_ipv4.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,7 @@ static void tcp_v4_send_ack(const struct sock *sk,
933933
ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ?
934934
inet_twsk(sk)->tw_mark : READ_ONCE(sk->sk_mark);
935935
ctl_sk->sk_priority = (sk->sk_state == TCP_TIME_WAIT) ?
936-
inet_twsk(sk)->tw_priority : sk->sk_priority;
936+
inet_twsk(sk)->tw_priority : READ_ONCE(sk->sk_priority);
937937
transmit_time = tcp_transmit_time(sk);
938938
ip_send_unicast_reply(ctl_sk,
939939
skb, &TCP_SKB_CB(skb)->header.h4.opt,

net/ipv6/raw.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -612,7 +612,7 @@ static int rawv6_send_hdrinc(struct sock *sk, struct msghdr *msg, int length,
612612
skb_reserve(skb, hlen);
613613

614614
skb->protocol = htons(ETH_P_IPV6);
615-
skb->priority = sk->sk_priority;
615+
skb->priority = READ_ONCE(sk->sk_priority);
616616
skb->mark = sockc->mark;
617617
skb->tstamp = sockc->transmit_time;
618618

net/ipv6/tcp_ipv6.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1131,7 +1131,8 @@ static void tcp_v6_reqsk_send_ack(const struct sock *sk, struct sk_buff *skb,
11311131
tcp_time_stamp_raw() + tcp_rsk(req)->ts_off,
11321132
READ_ONCE(req->ts_recent), sk->sk_bound_dev_if,
11331133
tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->saddr, l3index),
1134-
ipv6_get_dsfield(ipv6_hdr(skb)), 0, sk->sk_priority,
1134+
ipv6_get_dsfield(ipv6_hdr(skb)), 0,
1135+
READ_ONCE(sk->sk_priority),
11351136
READ_ONCE(tcp_rsk(req)->txhash));
11361137
}
11371138

net/packet/af_packet.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2053,7 +2053,7 @@ static int packet_sendmsg_spkt(struct socket *sock, struct msghdr *msg,
20532053

20542054
skb->protocol = proto;
20552055
skb->dev = dev;
2056-
skb->priority = sk->sk_priority;
2056+
skb->priority = READ_ONCE(sk->sk_priority);
20572057
skb->mark = READ_ONCE(sk->sk_mark);
20582058
skb->tstamp = sockc.transmit_time;
20592059

@@ -2576,7 +2576,7 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb,
25762576

25772577
skb->protocol = proto;
25782578
skb->dev = dev;
2579-
skb->priority = po->sk.sk_priority;
2579+
skb->priority = READ_ONCE(po->sk.sk_priority);
25802580
skb->mark = READ_ONCE(po->sk.sk_mark);
25812581
skb->tstamp = sockc->transmit_time;
25822582
skb_setup_tx_timestamp(skb, sockc->tsflags);
@@ -3053,7 +3053,7 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len)
30533053

30543054
skb->protocol = proto;
30553055
skb->dev = dev;
3056-
skb->priority = sk->sk_priority;
3056+
skb->priority = READ_ONCE(sk->sk_priority);
30573057
skb->mark = sockc.mark;
30583058
skb->tstamp = sockc.transmit_time;
30593059

0 commit comments

Comments
 (0)