Re: [net-next v5 1/4] net: af_unix: enable custom setsockopt for all socket types

Kuniyuki Iwashima <[email protected]>
Newsgroups org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel,org.kernel.vger.netdev
Message-ID <CAAVpQUCxyR3VDtkJQxG4HQF5HGzo-g=oG1rpKW8hCGUgVobBtQ@mail.gmail.com>
On Tue, Jul 28, 2026 at 4:05 PM Jori Koolstra <[email protected]> wrote:
>
> @Kuniyuki,
>
> Could you take a look at this if you have time? Would like to move this
> along if we can.

Sorry for the delay, I was on vacation for two weeks.

>
> Thanks,
> Jori.
>
> > Op 19-07-2026 14:31 CEST schreef Jori Koolstra <[email protected]>:
> >
> >
> > > Op 14-07-2026 11:19 CEST schreef Kuniyuki Iwashima <[email protected]>:
> > >
> > >
> > > On Sun, Jul 12, 2026 at 9:29 PM Jori Koolstra <[email protected]> wrote:
> > > >
> > > > unix_setsockopt() and the SOCK_CUSTOM_SOCKOPT flag were only wired up
> > > > for SOCK_STREAM (introduced along with the stream-only SO_INQ).
> > > > Consequently custom AF_UNIX options are unreachable on SOCK_DGRAM and
> > > > SOCK_SEQPACKET: those setsockopt() calls bypass unix_setsockopt() and
> > > > fall through to the generic sock_setsockopt(), failing with
> > > > -ENOPROTOOPT.
> > > >
> > > > Set SOCK_CUSTOM_SOCKOPT for every AF_UNIX socket type in unix_create(), and
> > > > also for accepted sockets in unix_accept() (reachable for stream and
> > > > seqpacket).
> > > >
> > > > This is a prerequisite for making SO_RIGHTS_NOTRUNC settable on all AF_UNIX
> > > > socket types.
> > > >
> > > > Signed-off-by: Jori Koolstra <[email protected]>
> > > > ---
> > > >  net/unix/af_unix.c | 10 ++++++----
> > > >  1 file changed, 6 insertions(+), 4 deletions(-)
> > > >
> > > > diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
> > > > index f7a9d55eee8a..3d256255085b 100644
> > > > --- a/net/unix/af_unix.c
> > > > +++ b/net/unix/af_unix.c
> > > > @@ -949,7 +949,7 @@ static int unix_setsockopt(struct socket *sock, int level, int optname,
> > > >         switch (optname) {
> > > >         case SO_INQ:
> > > >                 if (sk->sk_type != SOCK_STREAM)
> > > > -                       return -EINVAL;
> > > > +                       return -ENOPROTOOPT;
> > > >
> > > >                 if (val > 1 || val < 0)
> > > >                         return -EINVAL;
> > > > @@ -1005,6 +1005,7 @@ static const struct proto_ops unix_dgram_ops = {
> > > >  #endif
> > > >         .listen =       sock_no_listen,
> > > >         .shutdown =     unix_shutdown,
> > > > +       .setsockopt =   unix_setsockopt,
> > > >         .sendmsg =      unix_dgram_sendmsg,
> > > >         .read_skb =     unix_read_skb,
> > > >         .recvmsg =      unix_dgram_recvmsg,
> > > > @@ -1029,6 +1030,7 @@ static const struct proto_ops unix_seqpacket_ops = {
> > > >  #endif
> > > >         .listen =       unix_listen,
> > > >         .shutdown =     unix_shutdown,
> > > > +       .setsockopt =   unix_setsockopt,
> > > >         .sendmsg =      unix_seqpacket_sendmsg,
> > > >         .recvmsg =      unix_seqpacket_recvmsg,
> > > >         .mmap =         sock_no_mmap,
> > > > @@ -1142,9 +1144,10 @@ static int unix_create(struct net *net, struct socket *sock, int protocol,
> > > >         if (protocol && protocol != PF_UNIX)
> > > >                 return -EPROTONOSUPPORT;
> > > >
> > > > +       set_bit(SOCK_CUSTOM_SOCKOPT, &sock->flags);
> > >
> > > Please move this to unix_create1(), then we don't need the chunk below.
> > >
> > >
> >
> > I don't understand how this helps. The accept() path gets its struct socket from
> > sock_alloc() not via unix_create() afaict. Also, unix_create1() is called with
> > sock == NULL on connect(), so now you have to guard against that too.

It seems I misread sk/sock.  Please keep set_bit() as is.

Thanks !

> >
> > But maybe I misunderstand you?
> >
> > I do agree with you other comment, accept() should probably inherit the truncate
> > behavior from the listen() socket.
> >
> > Thanks,
> > Jori.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.