mirror of
https://github.com/torvalds/linux.git
synced 2026-05-23 14:42:08 +02:00
af_unix: Don't hold unix_state_lock() in __unix_dgram_recvmsg().
When __skb_try_recv_datagram() returns NULL in __unix_dgram_recvmsg(), we hold unix_state_lock() unconditionally. This is because SOCK_SEQPACKET sk needs to return EOF in case its peer has been close()d concurrently. This behaviour totally depends on the timing of the peer's close() and reading sk->sk_shutdown, and taking the lock does not play a role. Let's drop the lock from __unix_dgram_recvmsg() and use READ_ONCE(). Signed-off-by: Kuniyuki Iwashima <kuniyu@google.com> Reviewed-by: Willem de Bruijn <willemb@google.com> Link: https://patch.msgid.link/20250702223606.1054680-2-kuniyu@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
d18e43dddf
commit
b429a5ad19
|
|
@ -2527,12 +2527,10 @@ int __unix_dgram_recvmsg(struct sock *sk, struct msghdr *msg, size_t size,
|
|||
&err, &timeo, last));
|
||||
|
||||
if (!skb) { /* implies iolock unlocked */
|
||||
unix_state_lock(sk);
|
||||
/* Signal EOF on disconnected non-blocking SEQPACKET socket. */
|
||||
if (sk->sk_type == SOCK_SEQPACKET && err == -EAGAIN &&
|
||||
(sk->sk_shutdown & RCV_SHUTDOWN))
|
||||
(READ_ONCE(sk->sk_shutdown) & RCV_SHUTDOWN))
|
||||
err = 0;
|
||||
unix_state_unlock(sk);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user