From f5ea8b439d23e00d158ab1bb735172d67110533d Mon Sep 17 00:00:00 2001 From: Kuniyuki Iwashima Date: Wed, 21 May 2025 14:45:21 +0000 Subject: [PATCH] UPSTREAM: af_unix: Save listener for embryo socket. commit aed6ecef55d70de3762ce41c561b7f547dbaf107 upstream. This is a prep patch for the following change, where we need to fetch the listening socket from the successor embryo socket during GC. We add a new field to struct unix_sock to save a pointer to a listening socket. We set it when connect() creates a new socket, and clear it when accept() is called. Bug: 404256079 Signed-off-by: Kuniyuki Iwashima Acked-by: Paolo Abeni Link: https://lore.kernel.org/r/20240325202425.60930-8-kuniyu@amazon.com Signed-off-by: Jakub Kicinski Signed-off-by: Lee Jones Signed-off-by: Greg Kroah-Hartman (cherry picked from commit 36f924e4bf4e72fc6dbb240c1ed6a53d7a664b0f) Signed-off-by: Lee Jones Change-Id: I14341c883851e56a047d6e2a92c4f6a52c658f67 --- android/abi_gki_aarch64.stg | 47 +++++++++++++--------- android/abi_gki_aarch64.stg.allowed_breaks | 5 +++ include/net/af_unix.h | 1 + net/unix/af_unix.c | 5 ++- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 1142c52ebdb2..700638d5ea23 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -100499,10 +100499,10 @@ member { offset: 128 } member { - id: 0x80572460 + id: 0x805723f7 name: "gc_flags" type_id: 0x33756485 - offset: 8192 + offset: 8256 } member { id: 0x8fd944b0 @@ -112772,10 +112772,10 @@ member { offset: 16320 } member { - id: 0x79c0c441 + id: 0x79c0ce48 name: "inflight" type_id: 0x33756485 - offset: 8064 + offset: 8128 } member { id: 0x79f74293 @@ -123475,17 +123475,17 @@ member { type_id: 0xd3c80119 offset: 1024 } -member { - id: 0x556d5327 - name: "link" - type_id: 0xd3c80119 - offset: 7936 -} member { id: 0x556d57ec name: "link" type_id: 0xd3c80119 } +member { + id: 0x556d5b03 + name: "link" + type_id: 0xd3c80119 + offset: 8000 +} member { id: 0x556d5d6f name: "link" @@ -124338,6 +124338,12 @@ member { type_id: 0x2c912323 offset: 768 } +member { + id: 0xe2a2a0b6 + name: "listener" + type_id: 0x1d44326e + offset: 7936 +} member { id: 0xe2a2a2d7 name: "listener" @@ -125016,12 +125022,6 @@ member { type_id: 0xf313e71a offset: 32 } -member { - id: 0x2d1fe1e3 - name: "lock" - type_id: 0xf313e71a - offset: 8128 -} member { id: 0x2d1fe1f3 name: "lock" @@ -125202,6 +125202,12 @@ member { type_id: 0xf313e71a offset: 320 } +member { + id: 0x2d1feb84 + name: "lock" + type_id: 0xf313e71a + offset: 8192 +} member { id: 0x2d1feb9a name: "lock" @@ -277505,10 +277511,11 @@ struct_union { member_id: 0xd38b8035 member_id: 0xb794a532 member_id: 0x5eddc09d - member_id: 0x556d5327 - member_id: 0x79c0c441 - member_id: 0x2d1fe1e3 - member_id: 0x80572460 + member_id: 0xe2a2a0b6 + member_id: 0x556d5b03 + member_id: 0x79c0ce48 + member_id: 0x2d1feb84 + member_id: 0x805723f7 member_id: 0x337f3f92 member_id: 0x6a6786bf member_id: 0xac8121db diff --git a/android/abi_gki_aarch64.stg.allowed_breaks b/android/abi_gki_aarch64.stg.allowed_breaks index fa251856e55b..db5953402e3a 100644 --- a/android/abi_gki_aarch64.stg.allowed_breaks +++ b/android/abi_gki_aarch64.stg.allowed_breaks @@ -179,3 +179,8 @@ type 'struct unix_vertex' changed member 'unsigned long lowlink' was added member 'bool on_stack' was added +type 'struct unix_sock' changed + member 'struct sock* listener' was added + 4 members ('struct list_head link' .. 'unsigned long gc_flags') changed + offset changed by 64 + diff --git a/include/net/af_unix.h b/include/net/af_unix.h index 37171943fb54..2f4a7e6d6b9c 100644 --- a/include/net/af_unix.h +++ b/include/net/af_unix.h @@ -84,6 +84,7 @@ struct unix_sock { struct mutex iolock, bindlock; struct sock *peer; struct unix_vertex *vertex; + struct sock *listener; struct list_head link; unsigned long inflight; spinlock_t lock; diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 727e400b359a..27ed2410005d 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -978,6 +978,7 @@ static struct sock *unix_create1(struct net *net, struct socket *sock, int kern, sk->sk_max_ack_backlog = READ_ONCE(net->unx.sysctl_max_dgram_qlen); sk->sk_destruct = unix_sock_destructor; u = unix_sk(sk); + u->listener = NULL; u->inflight = 0; u->vertex = NULL; u->path.dentry = NULL; @@ -1582,6 +1583,7 @@ restart: newsk->sk_type = sk->sk_type; init_peercred(newsk); newu = unix_sk(newsk); + newu->listener = other; RCU_INIT_POINTER(newsk->sk_wq, &newu->peer_wq); otheru = unix_sk(other); @@ -1677,8 +1679,8 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags, bool kern) { struct sock *sk = sock->sk; - struct sock *tsk; struct sk_buff *skb; + struct sock *tsk; int err; err = -EOPNOTSUPP; @@ -1703,6 +1705,7 @@ static int unix_accept(struct socket *sock, struct socket *newsock, int flags, } tsk = skb->sk; + unix_sk(tsk)->listener = NULL; skb_free_datagram(sk, skb); wake_up_interruptible(&unix_sk(sk)->peer_wait);