* [PATCH v3 net 0/2] af_unix: Fix GC and improve selftest
@ 2024-05-17 9:27 Michal Luczaj
2024-05-17 9:27 ` [PATCH v3 net 1/2] af_unix: Fix garbage collection of embryos carrying OOB with SCM_RIGHTS Michal Luczaj
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Michal Luczaj @ 2024-05-17 9:27 UTC (permalink / raw)
To: netdev; +Cc: davem, edumazet, kuba, pabeni, kuniyu, shuah, Michal Luczaj
Series deals with AF_UNIX garbage collector mishandling some in-flight
graph cycles. Embryos carrying OOB packets with SCM_RIGHTS cause issues.
Patch 1/2 fixes the memory leak.
Patch 2/2 tweaks the selftest for a better OOB coverage.
v3:
- Patch 1/2: correct the commit message (Kuniyuki)
v2: https://lore.kernel.org/netdev/20240516145457.1206847-1-mhal@rbox.co/
- Patch 1/2: remove WARN_ON_ONCE() (Kuniyuki)
- Combine both patches into a series (Kuniyuki)
v1: https://lore.kernel.org/netdev/20240516103049.1132040-1-mhal@rbox.co/
Kuniyuki Iwashima (1):
selftest: af_unix: Make SCM_RIGHTS into OOB data.
Michal Luczaj (1):
af_unix: Fix garbage collection of embryos carrying OOB with
SCM_RIGHTS
net/unix/garbage.c | 23 +++++++++++--------
.../selftests/net/af_unix/scm_rights.c | 4 ++--
2 files changed, 16 insertions(+), 11 deletions(-)
--
2.45.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v3 net 1/2] af_unix: Fix garbage collection of embryos carrying OOB with SCM_RIGHTS
2024-05-17 9:27 [PATCH v3 net 0/2] af_unix: Fix GC and improve selftest Michal Luczaj
@ 2024-05-17 9:27 ` Michal Luczaj
2024-05-17 9:27 ` [PATCH v3 net 2/2] selftest: af_unix: Make SCM_RIGHTS into OOB data Michal Luczaj
2024-05-21 11:50 ` [PATCH v3 net 0/2] af_unix: Fix GC and improve selftest patchwork-bot+netdevbpf
2 siblings, 0 replies; 5+ messages in thread
From: Michal Luczaj @ 2024-05-17 9:27 UTC (permalink / raw)
To: netdev; +Cc: davem, edumazet, kuba, pabeni, kuniyu, shuah, Michal Luczaj
GC attempts to explicitly drop oob_skb's reference before purging the hit
list.
The problem is with embryos: kfree_skb(u->oob_skb) is never called on an
embryo socket.
The python script below [0] sends a listener's fd to its embryo as OOB
data. While GC does collect the embryo's queue, it fails to drop the OOB
skb's refcount. The skb which was in embryo's receive queue stays as
unix_sk(sk)->oob_skb and keeps the listener's refcount [1].
Tell GC to dispose embryo's oob_skb.
[0]:
from array import array
from socket import *
addr = '\x00unix-oob'
lis = socket(AF_UNIX, SOCK_STREAM)
lis.bind(addr)
lis.listen(1)
s = socket(AF_UNIX, SOCK_STREAM)
s.connect(addr)
scm = (SOL_SOCKET, SCM_RIGHTS, array('i', [lis.fileno()]))
s.sendmsg([b'x'], [scm], MSG_OOB)
lis.close()
[1]
$ grep unix-oob /proc/net/unix
$ ./unix-oob.py
$ grep unix-oob /proc/net/unix
0000000000000000: 00000002 00000000 00000000 0001 02 0 @unix-oob
0000000000000000: 00000002 00000000 00010000 0001 01 6072 @unix-oob
Fixes: 4090fa373f0e ("af_unix: Replace garbage collection algorithm.")
Signed-off-by: Michal Luczaj <mhal@rbox.co>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
---
net/unix/garbage.c | 23 ++++++++++++++---------
1 file changed, 14 insertions(+), 9 deletions(-)
diff --git a/net/unix/garbage.c b/net/unix/garbage.c
index 1f8b8cdfcdc8..dfe94a90ece4 100644
--- a/net/unix/garbage.c
+++ b/net/unix/garbage.c
@@ -342,6 +342,18 @@ enum unix_recv_queue_lock_class {
U_RECVQ_LOCK_EMBRYO,
};
+static void unix_collect_queue(struct unix_sock *u, struct sk_buff_head *hitlist)
+{
+ skb_queue_splice_init(&u->sk.sk_receive_queue, hitlist);
+
+#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
+ if (u->oob_skb) {
+ WARN_ON_ONCE(skb_unref(u->oob_skb));
+ u->oob_skb = NULL;
+ }
+#endif
+}
+
static void unix_collect_skb(struct list_head *scc, struct sk_buff_head *hitlist)
{
struct unix_vertex *vertex;
@@ -365,18 +377,11 @@ static void unix_collect_skb(struct list_head *scc, struct sk_buff_head *hitlist
/* listener -> embryo order, the inversion never happens. */
spin_lock_nested(&embryo_queue->lock, U_RECVQ_LOCK_EMBRYO);
- skb_queue_splice_init(embryo_queue, hitlist);
+ unix_collect_queue(unix_sk(skb->sk), hitlist);
spin_unlock(&embryo_queue->lock);
}
} else {
- skb_queue_splice_init(queue, hitlist);
-
-#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
- if (u->oob_skb) {
- kfree_skb(u->oob_skb);
- u->oob_skb = NULL;
- }
-#endif
+ unix_collect_queue(u, hitlist);
}
spin_unlock(&queue->lock);
--
2.45.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v3 net 2/2] selftest: af_unix: Make SCM_RIGHTS into OOB data.
2024-05-17 9:27 [PATCH v3 net 0/2] af_unix: Fix GC and improve selftest Michal Luczaj
2024-05-17 9:27 ` [PATCH v3 net 1/2] af_unix: Fix garbage collection of embryos carrying OOB with SCM_RIGHTS Michal Luczaj
@ 2024-05-17 9:27 ` Michal Luczaj
2024-05-19 8:44 ` Michal Luczaj
2024-05-21 11:50 ` [PATCH v3 net 0/2] af_unix: Fix GC and improve selftest patchwork-bot+netdevbpf
2 siblings, 1 reply; 5+ messages in thread
From: Michal Luczaj @ 2024-05-17 9:27 UTC (permalink / raw)
To: netdev; +Cc: davem, edumazet, kuba, pabeni, kuniyu, shuah
From: Kuniyuki Iwashima <kuniyu@amazon.com>
scm_rights.c covers various test cases for inflight file descriptors
and garbage collector for AF_UNIX sockets.
Currently, SCM_RIGHTS messages are sent with 3-bytes string, and it's
not good for MSG_OOB cases, as SCM_RIGTS cmsg goes with the first 2-bytes,
which is non-OOB data.
Let's send SCM_RIGHTS messages with 1-byte character to pack SCM_RIGHTS
into OOB data.
Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
---
tools/testing/selftests/net/af_unix/scm_rights.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/net/af_unix/scm_rights.c b/tools/testing/selftests/net/af_unix/scm_rights.c
index bab606c9f1eb..2bfed46e0b19 100644
--- a/tools/testing/selftests/net/af_unix/scm_rights.c
+++ b/tools/testing/selftests/net/af_unix/scm_rights.c
@@ -197,8 +197,8 @@ void __send_fd(struct __test_metadata *_metadata,
const FIXTURE_VARIANT(scm_rights) *variant,
int inflight, int receiver)
{
-#define MSG "nop"
-#define MSGLEN 3
+#define MSG "x"
+#define MSGLEN 1
struct {
struct cmsghdr cmsghdr;
int fd[2];
--
2.45.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v3 net 2/2] selftest: af_unix: Make SCM_RIGHTS into OOB data.
2024-05-17 9:27 ` [PATCH v3 net 2/2] selftest: af_unix: Make SCM_RIGHTS into OOB data Michal Luczaj
@ 2024-05-19 8:44 ` Michal Luczaj
0 siblings, 0 replies; 5+ messages in thread
From: Michal Luczaj @ 2024-05-19 8:44 UTC (permalink / raw)
To: netdev; +Cc: davem, edumazet, kuba, pabeni, kuniyu, shuah
On 5/17/24 11:27, Michal Luczaj wrote:
> From: Kuniyuki Iwashima <kuniyu@amazon.com>
>
> scm_rights.c covers various test cases for inflight file descriptors
> and garbage collector for AF_UNIX sockets.
>
> Currently, SCM_RIGHTS messages are sent with 3-bytes string, and it's
> not good for MSG_OOB cases, as SCM_RIGTS cmsg goes with the first 2-bytes,
> which is non-OOB data.
>
> Let's send SCM_RIGHTS messages with 1-byte character to pack SCM_RIGHTS
> into OOB data.
>
> Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
> ---
> tools/testing/selftests/net/af_unix/scm_rights.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/tools/testing/selftests/net/af_unix/scm_rights.c b/tools/testing/selftests/net/af_unix/scm_rights.c
> index bab606c9f1eb..2bfed46e0b19 100644
> --- a/tools/testing/selftests/net/af_unix/scm_rights.c
> +++ b/tools/testing/selftests/net/af_unix/scm_rights.c
> @@ -197,8 +197,8 @@ void __send_fd(struct __test_metadata *_metadata,
> const FIXTURE_VARIANT(scm_rights) *variant,
> int inflight, int receiver)
> {
> -#define MSG "nop"
> -#define MSGLEN 3
> +#define MSG "x"
> +#define MSGLEN 1
> struct {
> struct cmsghdr cmsghdr;
> int fd[2];
As discussed in
https://lore.kernel.org/netdev/20240517122419.0c9a0539@kernel.org/ :
Signed-off-by: Michal Luczaj <mhal@rbox.co>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v3 net 0/2] af_unix: Fix GC and improve selftest
2024-05-17 9:27 [PATCH v3 net 0/2] af_unix: Fix GC and improve selftest Michal Luczaj
2024-05-17 9:27 ` [PATCH v3 net 1/2] af_unix: Fix garbage collection of embryos carrying OOB with SCM_RIGHTS Michal Luczaj
2024-05-17 9:27 ` [PATCH v3 net 2/2] selftest: af_unix: Make SCM_RIGHTS into OOB data Michal Luczaj
@ 2024-05-21 11:50 ` patchwork-bot+netdevbpf
2 siblings, 0 replies; 5+ messages in thread
From: patchwork-bot+netdevbpf @ 2024-05-21 11:50 UTC (permalink / raw)
To: Michal Luczaj; +Cc: netdev, davem, edumazet, kuba, pabeni, kuniyu, shuah
Hello:
This series was applied to netdev/net.git (main)
by Paolo Abeni <pabeni@redhat.com>:
On Fri, 17 May 2024 11:27:00 +0200 you wrote:
> Series deals with AF_UNIX garbage collector mishandling some in-flight
> graph cycles. Embryos carrying OOB packets with SCM_RIGHTS cause issues.
>
> Patch 1/2 fixes the memory leak.
> Patch 2/2 tweaks the selftest for a better OOB coverage.
>
> v3:
> - Patch 1/2: correct the commit message (Kuniyuki)
>
> [...]
Here is the summary with links:
- [v3,net,1/2] af_unix: Fix garbage collection of embryos carrying OOB with SCM_RIGHTS
https://git.kernel.org/netdev/net/c/041933a1ec7b
- [v3,net,2/2] selftest: af_unix: Make SCM_RIGHTS into OOB data.
https://git.kernel.org/netdev/net/c/e060e433e512
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-05-21 11:50 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-17 9:27 [PATCH v3 net 0/2] af_unix: Fix GC and improve selftest Michal Luczaj
2024-05-17 9:27 ` [PATCH v3 net 1/2] af_unix: Fix garbage collection of embryos carrying OOB with SCM_RIGHTS Michal Luczaj
2024-05-17 9:27 ` [PATCH v3 net 2/2] selftest: af_unix: Make SCM_RIGHTS into OOB data Michal Luczaj
2024-05-19 8:44 ` Michal Luczaj
2024-05-21 11:50 ` [PATCH v3 net 0/2] af_unix: Fix GC and improve selftest patchwork-bot+netdevbpf
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.