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.