Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

inet_diag: annotate data-races in inet_diag_msg_common_fill()

inet_diag_msg_common_fill() can run without socket lock.
Add READ_ONCE() or data_race() annotations.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20250828102738.2065992-2-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Eric Dumazet and committed by
Jakub Kicinski
9a574257 34c21e91

+9 -9
+9 -9
net/ipv4/inet_diag.c
··· 71 71 72 72 void inet_diag_msg_common_fill(struct inet_diag_msg *r, struct sock *sk) 73 73 { 74 - r->idiag_family = sk->sk_family; 74 + r->idiag_family = READ_ONCE(sk->sk_family); 75 75 76 - r->id.idiag_sport = htons(sk->sk_num); 77 - r->id.idiag_dport = sk->sk_dport; 78 - r->id.idiag_if = sk->sk_bound_dev_if; 76 + r->id.idiag_sport = htons(READ_ONCE(sk->sk_num)); 77 + r->id.idiag_dport = READ_ONCE(sk->sk_dport); 78 + r->id.idiag_if = READ_ONCE(sk->sk_bound_dev_if); 79 79 sock_diag_save_cookie(sk, r->id.idiag_cookie); 80 80 81 81 #if IS_ENABLED(CONFIG_IPV6) 82 - if (sk->sk_family == AF_INET6) { 83 - *(struct in6_addr *)r->id.idiag_src = sk->sk_v6_rcv_saddr; 84 - *(struct in6_addr *)r->id.idiag_dst = sk->sk_v6_daddr; 82 + if (r->idiag_family == AF_INET6) { 83 + data_race(*(struct in6_addr *)r->id.idiag_src = sk->sk_v6_rcv_saddr); 84 + data_race(*(struct in6_addr *)r->id.idiag_dst = sk->sk_v6_daddr); 85 85 } else 86 86 #endif 87 87 { 88 88 memset(&r->id.idiag_src, 0, sizeof(r->id.idiag_src)); 89 89 memset(&r->id.idiag_dst, 0, sizeof(r->id.idiag_dst)); 90 90 91 - r->id.idiag_src[0] = sk->sk_rcv_saddr; 92 - r->id.idiag_dst[0] = sk->sk_daddr; 91 + r->id.idiag_src[0] = READ_ONCE(sk->sk_rcv_saddr); 92 + r->id.idiag_dst[0] = READ_ONCE(sk->sk_daddr); 93 93 } 94 94 } 95 95 EXPORT_SYMBOL_GPL(inet_diag_msg_common_fill);