]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
af_unix: Don't check SOCK_DEAD in unix_stream_read_skb().
authorKuniyuki Iwashima <kuniyu@google.com>
Wed, 2 Jul 2025 22:35:14 +0000 (22:35 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 9 Jul 2025 01:05:25 +0000 (18:05 -0700)
unix_stream_read_skb() checks SOCK_DEAD only when the dequeued skb is
OOB skb.

unix_stream_read_skb() is called for a SOCK_STREAM socket in SOCKMAP
when data is sent to it.

The function is invoked via sk_psock_verdict_data_ready(), which is
set to sk->sk_data_ready().

During sendmsg(), we check if the receiver has SOCK_DEAD, so there
is no point in checking it again later in ->read_skb().

Also, unix_read_skb() for SOCK_DGRAM does not have the test either.

Let's remove the SOCK_DEAD test in unix_stream_read_skb().

Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com>
Link: https://patch.msgid.link/20250702223606.1054680-3-kuniyu@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/unix/af_unix.c

index becd84737635cd125d5e10d28fd940b88e9ffb26..34ddea34e87e6d95b6e64377cdca2d3e7f994053 100644 (file)
@@ -2803,14 +2803,6 @@ static int unix_stream_read_skb(struct sock *sk, skb_read_actor_t recv_actor)
        if (unlikely(skb == READ_ONCE(u->oob_skb))) {
                bool drop = false;
 
-               unix_state_lock(sk);
-
-               if (sock_flag(sk, SOCK_DEAD)) {
-                       unix_state_unlock(sk);
-                       kfree_skb_reason(skb, SKB_DROP_REASON_SOCKET_CLOSE);
-                       return -ECONNRESET;
-               }
-
                spin_lock(&sk->sk_receive_queue.lock);
                if (likely(skb == u->oob_skb)) {
                        WRITE_ONCE(u->oob_skb, NULL);
@@ -2818,8 +2810,6 @@ static int unix_stream_read_skb(struct sock *sk, skb_read_actor_t recv_actor)
                }
                spin_unlock(&sk->sk_receive_queue.lock);
 
-               unix_state_unlock(sk);
-
                if (drop) {
                        kfree_skb_reason(skb, SKB_DROP_REASON_UNIX_SKIP_OOB);
                        return -EAGAIN;