]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
af_unix: Annotate data-races around sk->sk_state in sendmsg() and recvmsg().
authorKuniyuki Iwashima <kuniyu@amazon.com>
Tue, 4 Jun 2024 16:52:33 +0000 (09:52 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 5 Jul 2024 07:08:12 +0000 (09:08 +0200)
[ Upstream commit 8a34d4e8d9742a24f74998f45a6a98edd923319b ]

The following functions read sk->sk_state locklessly and proceed only if
the state is TCP_ESTABLISHED.

  * unix_stream_sendmsg
  * unix_stream_read_generic
  * unix_seqpacket_sendmsg
  * unix_seqpacket_recvmsg

Let's use READ_ONCE() there.

Fixes: a05d2ad1c1f3 ("af_unix: Only allow recv on connected seqpacket sockets.")
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
net/unix/af_unix.c

index 73cc992bed880368a65a8c28af2b5c494743bbc1..0611ff921421e1b43310f63c52547abcfabf8531 100644 (file)
@@ -1881,7 +1881,7 @@ static int unix_stream_sendmsg(struct socket *sock, struct msghdr *msg,
                goto out_err;
 
        if (msg->msg_namelen) {
-               err = sk->sk_state == TCP_ESTABLISHED ? -EISCONN : -EOPNOTSUPP;
+               err = READ_ONCE(sk->sk_state) == TCP_ESTABLISHED ? -EISCONN : -EOPNOTSUPP;
                goto out_err;
        } else {
                err = -ENOTCONN;
@@ -2083,7 +2083,7 @@ static int unix_seqpacket_sendmsg(struct socket *sock, struct msghdr *msg,
        if (err)
                return err;
 
-       if (sk->sk_state != TCP_ESTABLISHED)
+       if (READ_ONCE(sk->sk_state) != TCP_ESTABLISHED)
                return -ENOTCONN;
 
        if (msg->msg_namelen)
@@ -2097,7 +2097,7 @@ static int unix_seqpacket_recvmsg(struct socket *sock, struct msghdr *msg,
 {
        struct sock *sk = sock->sk;
 
-       if (sk->sk_state != TCP_ESTABLISHED)
+       if (READ_ONCE(sk->sk_state) != TCP_ESTABLISHED)
                return -ENOTCONN;
 
        return unix_dgram_recvmsg(sock, msg, size, flags);
@@ -2293,7 +2293,7 @@ static int unix_stream_read_generic(struct unix_stream_read_state *state,
        size_t size = state->size;
        unsigned int last_len;
 
-       if (unlikely(sk->sk_state != TCP_ESTABLISHED)) {
+       if (unlikely(READ_ONCE(sk->sk_state) != TCP_ESTABLISHED)) {
                err = -EINVAL;
                goto out;
        }