From: Slawomir Stepien <sst@poczta.fm>
To: Chuck Lever <cel@kernel.org>
Cc: syzbot <syzbot@kernel.org>,
syzkaller-bugs@googlegroups.com, Anna Schumaker <anna@kernel.org>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jeff Layton <jlayton@kernel.org>,
Jakub Kicinski <kuba@kernel.org>,
linux-nfs@vger.kernel.org, netdev@vger.kernel.org,
Paolo Abeni <pabeni@redhat.com>,
Trond Myklebust <trondmy@kernel.org>,
Trond Myklebust <trond.myklebust@primarydata.com>,
Dai Ngo <Dai.Ngo@oracle.com>, Simon Horman <horms@kernel.org>,
linux-kernel@vger.kernel.org, NeilBrown <neil@brown.name>,
Olga Kornievskaia <okorniev@redhat.com>,
syzbot@lists.linux.dev, Tom Talpey <tom@talpey.com>
Subject: Re: [PATCH] sunrpc: reject socket already in use in svc_addsock()
Date: Thu, 3 Sep 2026 16:05:47 +0200 [thread overview]
Message-ID: <apl-u5wtRUO6o5wC@nr200> (raw)
In-Reply-To: <c31de847-f77f-4dd8-87c4-46e3d21c57a9@app.fastmail.com>
On wrz 03, 2026 09:48, Chuck Lever wrote:
> On Thu, Sep 3, 2026, at 9:28 AM, syzbot wrote:
> > From: Slawomir Stepien <sst@poczta.fm>
> >
> > When a socket is added to an RPC service via svc_addsock() (for example, by
> > writing its file descriptor to /proc/fs/nfsd/portlist), svc_setup_socket()
> > saves the original socket callbacks (such as sk_state_change) into struct
> > svc_sock and replaces them with RPC-specific callbacks (such as
> > svc_tcp_state_change). It also attaches the new svc_sock to
> > sk->sk_user_data.
> >
> > If the same socket file descriptor is added to an RPC service again,
> > svc_addsock() invokes svc_setup_socket() a second time on the same socket.
> > During the second setup, svsk->sk_ostate is assigned the socket's current
> > sk_state_change callback, which was already replaced with
> > svc_tcp_state_change. When a state change event subsequently occurs on the
> > socket (for example, when connect() is called), svc_tcp_state_change()
> > invokes svsk->sk_ostate, calling itself in an infinite recursion until the
> > kernel stack overflows and triggers a stack guard page fault:
> >
> > BUG: TASK stack guard page was hit at ffffc900030b7ff8 (stack is
> > ffffc900030b8000..ffffc900030c0000)
> > Oops: stack guard page: 0000 [#1] SMP KASAN NOPTI
> > ...
> > Call Trace:
> > <TASK>
> > svc_tcp_state_change+0x76/0x2e0 net/sunrpc/svcsock.c:917
> > svc_tcp_state_change+0x76/0x2e0 net/sunrpc/svcsock.c:917
> > svc_tcp_state_change+0x76/0x2e0 net/sunrpc/svcsock.c:917
> > ...
> > tcp_done_with_error net/ipv4/tcp_input.c:4877 [inline]
> > tcp_reset+0x176/0x380 net/ipv4/tcp_input.c:4909
> > tcp_rcv_synsent_state_process net/ipv4/tcp_input.c:6903 [inline]
> > tcp_rcv_state_process+0x13bc/0x48a0 net/ipv4/tcp_input.c:7197
> > tcp_v4_do_rcv+0xafc/0x1530 net/ipv4/tcp_ipv4.c:1876
> > sk_backlog_rcv include/net/sock.h:1192 [inline]
> > __release_sock+0x25b/0x390 net/core/sock.c:3260
> > release_sock+0x190/0x260 net/core/sock.c:3859
> > inet_wait_for_connect net/ipv4/af_inet.c:616 [inline]
> > __inet_stream_connect+0x863/0xe00 net/ipv4/af_inet.c:710
> > inet_stream_connect+0x66/0xa0 net/ipv4/af_inet.c:755
> > connect_socket net/socket.c:2141 [inline]
> > __sys_connect_file net/socket.c:2166 [inline]
> > __sys_connect+0x316/0x450 net/socket.c:2183
> > ...
> > </TASK>
> >
> > Fix this by checking if so->sk->sk_user_data is already set in
> > svc_addsock() before proceeding with svc_setup_socket(). If it is already
> > non-NULL, return -EBUSY to prevent re-initializing an active socket.
> >
> > Fixes: fa9251afc33c ("SUNRPC: Call the default socket callbacks instead
> > of open coding")
> > Assisted-by: Gemini:gemini-3.7-flash Gemini:gemini-3.1-pro-preview
> > syzbot
> > Reported-by: syzbot+c9834a0c0215e6d8697a@syzkaller.appspotmail.com
> > Closes: https://syzkaller.appspot.com/bug?extid=c9834a0c0215e6d8697a
> > Link:
> > https://syzkaller.appspot.com/ai_job?id=30de91d1-1d14-4676-8c38-a3564f7acf48
> > Signed-off-by: Slawomir Stepien <sst@poczta.fm>
> >
> > ---
> > diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
> > index 50e5e7f5b..e8cc4329f 100644
> > --- a/net/sunrpc/svcsock.c
> > +++ b/net/sunrpc/svcsock.c
> > @@ -1541,6 +1541,9 @@ int svc_addsock(struct svc_serv *serv, struct net
> > *net, const int fd,
> > err = -EISCONN;
> > if (so->state > SS_UNCONNECTED)
> > goto out;
> > + err = -EBUSY;
> > + if (so->sk->sk_user_data)
> > + goto out;
> > err = -ENOENT;
> > if (!try_module_get(THIS_MODULE))
> > goto out;
> >
> >
> > base-commit: cee9395acd8043be0644b25c34bfa86623f2b935
>
> A similar fix is already in nfsd-testing:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git/commit/net/sunrpc/svcsock.c?h=nfsd-testing&id=7e8d1b4845aac4ad3c7bcd39032754917f5b966d
Ah ok, a different extid of syzbug that's why I've missed it. Thanks!
--
Slawomir Stepien
prev parent reply other threads:[~2026-09-03 14:06 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 13:28 [PATCH] sunrpc: reject socket already in use in svc_addsock() syzbot
2026-09-03 13:48 ` Chuck Lever
2026-09-03 14:05 ` Slawomir Stepien [this message]
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=apl-u5wtRUO6o5wC@nr200 \
--to=sst@poczta.fm \
--cc=Dai.Ngo@oracle.com \
--cc=anna@kernel.org \
--cc=cel@kernel.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=jlayton@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=neil@brown.name \
--cc=netdev@vger.kernel.org \
--cc=okorniev@redhat.com \
--cc=pabeni@redhat.com \
--cc=syzbot@kernel.org \
--cc=syzbot@lists.linux.dev \
--cc=syzkaller-bugs@googlegroups.com \
--cc=tom@talpey.com \
--cc=trond.myklebust@primarydata.com \
--cc=trondmy@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox