From: Andrea Parri <parri.andrea@gmail.com>
To: Kees Cook <kees@kernel.org>
Cc: Andrea Parri <parri.andrea@gmail.com>,
Andy Lutomirski <luto@amacapital.net>,
Will Drewry <wad@chromium.org>, Shuah Khan <shuah@kernel.org>,
Rodrigo Campos <rodrigo@kinvolk.io>,
Christian Brauner <brauner@kernel.org>,
Tycho Andersen <tycho@tycho.pizza>,
Sargun Dhillon <sargun@sargun.me>, Hui Peng <benquike@gmail.com>,
Bradley Morgan <brads@mainlining.org>,
Cong Wang <cwang@multikernel.io>,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
bpf@vger.kernel.org
Subject: [PATCH 1/4] seccomp: wake poll waiters after failed addfd send
Date: Wed, 4 Nov 2026 11:37:31 +0100 [thread overview]
Message-ID: <20261104103736.71956-2-parri.andrea@gmail.com> (raw)
In-Reply-To: <20261104103736.71956-1-parri.andrea@gmail.com>
An atomic SECCOMP_IOCTL_NOTIF_ADDFD request stops the listener from
reporting EPOLLOUT for its notification while the request is pending. If
installing the file descriptor fails, the notification becomes writable
again, but poll waiters are not woken. A supervisor waiting for EPOLLOUT
can then remain asleep, leaving the target blocked in the trapped syscall.
This affects edge-triggered epoll if the supervisor consumed the event
before the request, and level-triggered epoll, poll() and select() if a
concurrent waiter found no EPOLLOUT while the request was pending.
The atomic path changes the state from SENT to REPLIED before asking the
target to install the descriptor. seccomp_handle_addfd() restores SENT on
failure, but unlike seccomp_notify_recv(), it does not wake poll waiters.
Wake EPOLLOUT waiters on that failure path. Extend the RLIMIT_NOFILE
test to consume the initial edge and require another after a failed
ADDFD+SEND.
The bug was found and the fix was written with the help of an LLM.
Fixes: 0ae71c7720e3a ("seccomp: Support atomic "addfd + send reply"")
Cc: stable@vger.kernel.org
Signed-off-by: Andrea Parri <parri.andrea@gmail.com>
---
kernel/seccomp.c | 7 +++++--
tools/testing/selftests/seccomp/seccomp_bpf.c | 15 ++++++++++++++-
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/kernel/seccomp.c b/kernel/seccomp.c
index 3eecba5ccdef3..d74e66bcb5211 100644
--- a/kernel/seccomp.c
+++ b/kernel/seccomp.c
@@ -1125,7 +1125,9 @@ static u64 seccomp_next_notify_id(struct seccomp_filter *filter)
return filter->notif->next_id++;
}
-static void seccomp_handle_addfd(struct seccomp_kaddfd *addfd, struct seccomp_knotif *n)
+static void seccomp_handle_addfd(struct seccomp_filter *filter,
+ struct seccomp_kaddfd *addfd,
+ struct seccomp_knotif *n)
{
int fd;
@@ -1144,6 +1146,7 @@ static void seccomp_handle_addfd(struct seccomp_kaddfd *addfd, struct seccomp_kn
/* If we fail reset and return an error to the notifier */
if (fd < 0) {
n->state = SECCOMP_NOTIFY_SENT;
+ wake_up_poll(&filter->wqh, EPOLLOUT | EPOLLWRNORM);
} else {
/* Return the FD we just added */
n->flags = 0;
@@ -1224,7 +1227,7 @@ static int seccomp_do_user_notification(int this_syscall,
struct seccomp_kaddfd, list);
/* Check if we were woken up by a addfd message */
if (addfd)
- seccomp_handle_addfd(addfd, &n);
+ seccomp_handle_addfd(match, addfd, &n);
} while (n.state != SECCOMP_NOTIFY_REPLIED);
diff --git a/tools/testing/selftests/seccomp/seccomp_bpf.c b/tools/testing/selftests/seccomp/seccomp_bpf.c
index 66bb53bad93bc..6dd51efe8dff1 100644
--- a/tools/testing/selftests/seccomp/seccomp_bpf.c
+++ b/tools/testing/selftests/seccomp/seccomp_bpf.c
@@ -22,6 +22,7 @@
#include <errno.h>
#include <linux/filter.h>
+#include <sys/epoll.h>
#include <sys/prctl.h>
#include <sys/ptrace.h>
#include <sys/time.h>
@@ -4391,7 +4392,10 @@ TEST(user_notification_addfd_rlimit)
{
pid_t pid;
long ret;
- int status, listener, memfd;
+ int epollfd, status, listener, memfd;
+ struct epoll_event event = {
+ .events = EPOLLOUT | EPOLLET,
+ };
struct seccomp_notif_addfd addfd = {};
struct seccomp_notif req = {};
struct seccomp_notif_resp resp = {};
@@ -4434,9 +4438,17 @@ TEST(user_notification_addfd_rlimit)
EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd), -1);
EXPECT_EQ(errno, EMFILE);
+ epollfd = epoll_create1(EPOLL_CLOEXEC);
+ ASSERT_GE(epollfd, 0);
+ ASSERT_EQ(epoll_ctl(epollfd, EPOLL_CTL_ADD, listener, &event), 0);
+ ASSERT_EQ(epoll_wait(epollfd, &event, 1, 1000), 1);
+ ASSERT_NE(event.events & EPOLLOUT, 0);
+
addfd.flags = SECCOMP_ADDFD_FLAG_SEND;
EXPECT_EQ(ioctl(listener, SECCOMP_IOCTL_NOTIF_ADDFD, &addfd), -1);
EXPECT_EQ(errno, EMFILE);
+ EXPECT_EQ(epoll_wait(epollfd, &event, 1, 1000), 1);
+ EXPECT_NE(event.events & EPOLLOUT, 0);
addfd.newfd = 100;
addfd.flags = SECCOMP_ADDFD_FLAG_SETFD;
@@ -4454,6 +4466,7 @@ TEST(user_notification_addfd_rlimit)
EXPECT_EQ(true, WIFEXITED(status));
EXPECT_EQ(0, WEXITSTATUS(status));
+ close(epollfd);
close(memfd);
}
--
2.53.0
next prev parent reply other threads:[~2026-11-04 10:37 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-04 10:37 [PATCH 0/4] seccomp: fix user-notification state transitions Andrea Parri
2026-11-04 10:37 ` Andrea Parri [this message]
2026-11-04 16:19 ` [PATCH 1/4] seccomp: wake poll waiters after failed addfd send Tycho Andersen
2026-11-04 10:37 ` [PATCH 2/4] seccomp: wake poll waiters after interrupted " Andrea Parri
2026-11-04 10:37 ` [PATCH 3/4] seccomp: add a helper to move a notification to SENT Andrea Parri
2026-11-04 10:37 ` [PATCH 4/4] seccomp: publish user notifications after copying them to userspace Andrea Parri
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=20261104103736.71956-2-parri.andrea@gmail.com \
--to=parri.andrea@gmail.com \
--cc=benquike@gmail.com \
--cc=bpf@vger.kernel.org \
--cc=brads@mainlining.org \
--cc=brauner@kernel.org \
--cc=cwang@multikernel.io \
--cc=kees@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=luto@amacapital.net \
--cc=rodrigo@kinvolk.io \
--cc=sargun@sargun.me \
--cc=shuah@kernel.org \
--cc=tycho@tycho.pizza \
--cc=wad@chromium.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
all inboxes | Powered by JetHome®