Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit 95036a7

Browse files
avaginkees
authored andcommitted
seccomp: interrupt SECCOMP_IOCTL_NOTIF_RECV when all users have exited
SECCOMP_IOCTL_NOTIF_RECV promptly returns when a seccomp filter becomes unused, as a filter without users can't trigger any events. Previously, event listeners had to rely on epoll to detect when all processes had exited. The change is based on the 'commit 99cdb8b ("seccomp: notify about unused filter")' which implemented (E)POLLHUP notifications. Reviewed-by: Christian Brauner <brauner@kernel.org> Signed-off-by: Andrei Vagin <avagin@google.com> Reviewed-by: Oleg Nesterov <oleg@redhat.com> Link: https://lore.kernel.org/r/20240628021014.231976-2-avagin@google.com Reviewed-by: Tycho Andersen <tandersen@netflix.com> Signed-off-by: Kees Cook <kees@kernel.org>
1 parent c3f38fa commit 95036a7

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

kernel/seccomp.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1466,7 +1466,7 @@ static int recv_wake_function(wait_queue_entry_t *wait, unsigned int mode, int s
14661466
void *key)
14671467
{
14681468
/* Avoid a wakeup if event not interesting for us. */
1469-
if (key && !(key_to_poll(key) & (EPOLLIN | EPOLLERR)))
1469+
if (key && !(key_to_poll(key) & (EPOLLIN | EPOLLERR | EPOLLHUP)))
14701470
return 0;
14711471
return autoremove_wake_function(wait, mode, sync, key);
14721472
}
@@ -1476,6 +1476,9 @@ static int recv_wait_event(struct seccomp_filter *filter)
14761476
DEFINE_WAIT_FUNC(wait, recv_wake_function);
14771477
int ret;
14781478

1479+
if (refcount_read(&filter->users) == 0)
1480+
return 0;
1481+
14791482
if (atomic_dec_if_positive(&filter->notif->requests) >= 0)
14801483
return 0;
14811484

@@ -1484,6 +1487,8 @@ static int recv_wait_event(struct seccomp_filter *filter)
14841487

14851488
if (atomic_dec_if_positive(&filter->notif->requests) >= 0)
14861489
break;
1490+
if (refcount_read(&filter->users) == 0)
1491+
break;
14871492

14881493
if (ret)
14891494
return ret;

0 commit comments

Comments
 (0)