summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWenbo Sun <sunwenbo@cmss.chinamobile.com>2026-11-11 10:32:22 +0800
committerJakub Kicinski <kuba@kernel.org>2026-11-12 10:43:17 -0800
commit0359338fd8cf1a2dc001d0cd69c331c17decee88 (patch)
treeb74adfb2b4b33efcb8ee2bb396cf89291c5881e3
parenta9782a6f2bbd0c444689725a710d8b21eab61bc5 (diff)
downloadlinux-0359338fd8cf1a2dc001d0cd69c331c17decee88.tar.gz
linux-0359338fd8cf1a2dc001d0cd69c331c17decee88.zip
af_unix: Inherit SO_INQ in unix_stream_connect()
When SO_INQ is enabled on a listening AF_UNIX SOCK_STREAM socket, accepted sockets created by unix_stream_connect() do not inherit u->recvmsg_inq from the listener, unlike TCP_INQ, AF_VSOCK SO_INQ, and AF_UNIX SO_RIGHTS_NOTRUNC. As a result, recvmsg() on the accepted socket never puts an SCM_INQ control message unless SO_INQ is set again after accept(). Copy otheru->recvmsg_inq to newu->recvmsg_inq in unix_stream_connect() using READ_ONCE() to pair with the lockless WRITE_ONCE() in unix_setsockopt(). Found during LLM-assisted code review of unix_stream_connect() while comparing option inheritance between SO_INQ and SO_RIGHTS_NOTRUNC. Confirmed on UML (x86_64) by enabling SO_INQ on a listening AF_UNIX SOCK_STREAM socket before listen() and accept(), sending data from a connected client, and observing that recvmsg() on the accepted socket returned no SCM_INQ control message. Tested on UML (x86_64) against the reproducer, verifying that recvmsg() on the accepted socket now returns the expected SCM_INQ control message, and ran the tools/testing/selftests/net/af_unix/scm_inq selftest (all 6 test cases passed). Fixes: df30285b3670 ("af_unix: Introduce SO_INQ.") Signed-off-by: Wenbo Sun <sunwenbo@cmss.chinamobile.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@google.com> Link: https://patch.msgid.link/20261111023222.77227-1-sunwenbo@cmss.chinamobile.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--net/unix/af_unix.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 98fcfd7301f6..f847cf1fbeaf 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -1750,6 +1750,7 @@ restart:
newu = unix_sk(newsk);
otheru = unix_sk(other);
newu->listener = other;
+ newu->recvmsg_inq = READ_ONCE(otheru->recvmsg_inq);
newu->scm_rights_notrunc = READ_ONCE(otheru->scm_rights_notrunc);
RCU_INIT_POINTER(newsk->sk_wq, &newu->peer_wq);