From: John Fastabend <john.fastabend@gmail.com>
To: Kuniyuki Iwashima <kuniyu@amazon.com>, mhal@rbox.co
Cc: Rao.Shoaib@oracle.com, bpf@vger.kernel.org,
cong.wang@bytedance.com, davem@davemloft.net,
edumazet@google.com, jakub@cloudflare.com,
john.fastabend@gmail.com, kuba@kernel.org, kuniyu@amazon.com,
netdev@vger.kernel.org, pabeni@redhat.com
Subject: Re: [PATCH bpf v3 1/4] af_unix: Disable MSG_OOB handling for sockets in sockmap/sockhash
Date: Mon, 08 Jul 2024 18:24:02 -0700 [thread overview]
Message-ID: <668c9132195f6_d7720840@john.notmuch> (raw)
In-Reply-To: <20240708193820.3392-1-kuniyu@amazon.com>
Kuniyuki Iwashima wrote:
> From: Michal Luczaj <mhal@rbox.co>
> Date: Sun, 7 Jul 2024 23:28:22 +0200
> > AF_UNIX socket tracks the most recent OOB packet (in its receive queue)
> > with an `oob_skb` pointer. BPF redirecting does not account for that: when
> > an OOB packet is moved between sockets, `oob_skb` is left outdated. This
> > results in a single skb that may be accessed from two different sockets.
> >
> > Take the easy way out: silently drop MSG_OOB data targeting any socket that
> > is in a sockmap or a sockhash. Note that such silent drop is akin to the
> > fate of redirected skb's scm_fp_list (SCM_RIGHTS, SCM_CREDENTIALS).
> >
> > For symmetry, forbid MSG_OOB in unix_bpf_recvmsg().
> >
> > Suggested-by: Kuniyuki Iwashima <kuniyu@amazon.com>
> > Fixes: 314001f0bf92 ("af_unix: Add OOB support")
> > Signed-off-by: Michal Luczaj <mhal@rbox.co>
>
Why does af_unix put the oob data on the sk_receive_queue()? Wouldn't it
be enough to just have the ousk->oob_skb hold the reference to the skb?
I think for TCP/UDP at least I'll want to handle MSG_OOB data correctly.
For redirect its probably fine to just drop or skip it, but when we are
just reading recv msgs and parsing/observing it would be nice to not change
how the application works. In practice I don't recall anyone reporting
issues on TCP side though from incorrectly handling URG data.
From TCP side I believe we can fix the OOB case by checking the oob queue
before doing the recvmsg handling. If the urg data wasn't on the general
sk_receive_queue we could do similar here for af_unix? My argument for
URG not working for redirect would be to let userspace handle it if they
cared.
Thanks.
> Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
>
> Thanks!
>
>
> > ---
> > net/unix/af_unix.c | 41 ++++++++++++++++++++++++++++++++++++++++-
> > net/unix/unix_bpf.c | 3 +++
> > 2 files changed, 43 insertions(+), 1 deletion(-)
> >
> > diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
> > index 142f56770b77..11cb5badafb6 100644
> > --- a/net/unix/af_unix.c
> > +++ b/net/unix/af_unix.c
> > @@ -2667,10 +2667,49 @@ static struct sk_buff *manage_oob(struct sk_buff *skb, struct sock *sk,
> >
> > static int unix_stream_read_skb(struct sock *sk, skb_read_actor_t recv_actor)
> > {
> > + struct unix_sock *u = unix_sk(sk);
> > + struct sk_buff *skb;
> > + int err;
> > +
> > if (unlikely(READ_ONCE(sk->sk_state) != TCP_ESTABLISHED))
> > return -ENOTCONN;
> >
> > - return unix_read_skb(sk, recv_actor);
> > + mutex_lock(&u->iolock);
> > + skb = skb_recv_datagram(sk, MSG_DONTWAIT, &err);
> > + mutex_unlock(&u->iolock);
> > + if (!skb)
> > + return err;
> > +
> > +#if IS_ENABLED(CONFIG_AF_UNIX_OOB)
> > + 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(skb);
> > + return -ECONNRESET;
> > + }
> > +
> > + spin_lock(&sk->sk_receive_queue.lock);
> > + if (likely(skb == u->oob_skb)) {
> > + WRITE_ONCE(u->oob_skb, NULL);
> > + drop = true;
> > + }
> > + spin_unlock(&sk->sk_receive_queue.lock);
> > +
> > + unix_state_unlock(sk);
> > +
> > + if (drop) {
> > + WARN_ON_ONCE(skb_unref(skb));
> > + kfree_skb(skb);
> > + return -EAGAIN;
> > + }
> > + }
> > +#endif
> > +
> > + return recv_actor(sk, skb);
> > }
> >
> > static int unix_stream_read_generic(struct unix_stream_read_state *state,
> > diff --git a/net/unix/unix_bpf.c b/net/unix/unix_bpf.c
> > index bd84785bf8d6..bca2d86ba97d 100644
> > --- a/net/unix/unix_bpf.c
> > +++ b/net/unix/unix_bpf.c
> > @@ -54,6 +54,9 @@ static int unix_bpf_recvmsg(struct sock *sk, struct msghdr *msg,
> > struct sk_psock *psock;
> > int copied;
> >
> > + if (flags & MSG_OOB)
> > + return -EOPNOTSUPP;
> > +
> > if (!len)
> > return 0;
> >
> > --
> > 2.45.2
next prev parent reply other threads:[~2024-07-09 1:24 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-07 21:28 [PATCH bpf v3 0/4] af_unix: MSG_OOB handling fix & selftest Michal Luczaj
2024-07-07 21:28 ` [PATCH bpf v3 1/4] af_unix: Disable MSG_OOB handling for sockets in sockmap/sockhash Michal Luczaj
2024-07-08 19:38 ` Kuniyuki Iwashima
2024-07-09 1:24 ` John Fastabend [this message]
2024-07-09 2:18 ` Kuniyuki Iwashima
2024-07-09 9:48 ` Jakub Sitnicki
2024-07-07 21:28 ` [PATCH bpf v3 2/4] selftest/bpf: Support SOCK_STREAM in unix_inet_redir_to_connected() Michal Luczaj
2024-07-09 9:48 ` Jakub Sitnicki
2024-07-11 20:33 ` Michal Luczaj
2024-07-13 9:45 ` Jakub Sitnicki
2024-07-13 20:16 ` Michal Luczaj
2024-07-16 9:14 ` Jakub Sitnicki
2024-07-16 20:58 ` Michal Luczaj
2024-07-17 20:15 ` Michal Luczaj
2024-07-19 11:09 ` Jakub Sitnicki
2024-07-22 13:07 ` Michal Luczaj
2024-07-22 19:26 ` Jakub Sitnicki
2024-07-22 22:07 ` Eduard Zingerman
2024-07-22 22:21 ` Eduard Zingerman
2024-07-23 12:31 ` Michal Luczaj
2024-07-24 11:36 ` Michal Luczaj
2024-07-07 21:28 ` [PATCH bpf v3 3/4] selftest/bpf: Parametrize AF_UNIX redir functions to accept send() flags Michal Luczaj
2024-07-09 9:59 ` Jakub Sitnicki
2024-07-11 20:34 ` Michal Luczaj
2024-07-07 21:28 ` [PATCH bpf v3 4/4] selftest/bpf: Test sockmap redirect for AF_UNIX MSG_OOB Michal Luczaj
2024-07-09 10:08 ` Jakub Sitnicki
2024-07-11 20:35 ` Michal Luczaj
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=668c9132195f6_d7720840@john.notmuch \
--to=john.fastabend@gmail.com \
--cc=Rao.Shoaib@oracle.com \
--cc=bpf@vger.kernel.org \
--cc=cong.wang@bytedance.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=jakub@cloudflare.com \
--cc=kuba@kernel.org \
--cc=kuniyu@amazon.com \
--cc=mhal@rbox.co \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.