]> www.infradead.org Git - users/hch/xfs.git/commitdiff
af_unix: Annotate data-races around sk->sk_sndbuf.
authorKuniyuki Iwashima <kuniyu@amazon.com>
Tue, 4 Jun 2024 16:52:36 +0000 (09:52 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 6 Jun 2024 10:57:15 +0000 (12:57 +0200)
sk_setsockopt() changes sk->sk_sndbuf under lock_sock(), but it's
not used in af_unix.c.

Let's use READ_ONCE() to read sk->sk_sndbuf in unix_writable(),
unix_dgram_sendmsg(), and unix_stream_sendmsg().

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/unix/af_unix.c

index e7b74207aa3bda00b9064af9071a3d5a6d4663ae..de2a5e334a88eb11235d4308142f63508795d728 100644 (file)
@@ -533,7 +533,7 @@ static int unix_dgram_peer_wake_me(struct sock *sk, struct sock *other)
 static int unix_writable(const struct sock *sk, unsigned char state)
 {
        return state != TCP_LISTEN &&
-              (refcount_read(&sk->sk_wmem_alloc) << 2) <= sk->sk_sndbuf;
+               (refcount_read(&sk->sk_wmem_alloc) << 2) <= READ_ONCE(sk->sk_sndbuf);
 }
 
 static void unix_write_space(struct sock *sk)
@@ -1967,7 +1967,7 @@ static int unix_dgram_sendmsg(struct socket *sock, struct msghdr *msg,
        }
 
        err = -EMSGSIZE;
-       if (len > sk->sk_sndbuf - 32)
+       if (len > READ_ONCE(sk->sk_sndbuf) - 32)
                goto out;
 
        if (len > SKB_MAX_ALLOC) {
@@ -2247,7 +2247,7 @@ static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
                                                   &err, 0);
                } else {
                        /* Keep two messages in the pipe so it schedules better */
-                       size = min_t(int, size, (sk->sk_sndbuf >> 1) - 64);
+                       size = min_t(int, size, (READ_ONCE(sk->sk_sndbuf) >> 1) - 64);
 
                        /* allow fallback to order-0 allocations */
                        size = min_t(int, size, SKB_MAX_HEAD(0) + UNIX_SKB_FRAGS_SZ);