• Andrei Vagin's avatar
    seccomp: release task filters when the task exits · bfafe5ef
    Andrei Vagin authored
    Previously, seccomp filters were released in release_task(), which
    required the process to exit and its zombie to be collected. However,
    exited threads/processes can't trigger any seccomp events, making it
    more logical to release filters upon task exits.
    
    This adjustment simplifies scenarios where a parent is tracing its child
    process. The parent process can now handle all events from a seccomp
    listening descriptor and then call wait to collect a child zombie.
    
    seccomp_filter_release takes the siglock to avoid races with
    seccomp_sync_threads. There was an idea to bypass taking the lock by
    checking PF_EXITING, but it can be set without holding siglock if
    threads have SIGNAL_GROUP_EXIT. This means it can happen concurently
    with seccomp_filter_release.
    
    This change also fixes another minor problem. Suppose that a group
    leader installs the new filter without SECCOMP_FILTER_FLAG_TSYNC, exits,
    and becomes a zombie. Without this change, SECCOMP_FILTER_FLAG_TSYNC
    from any other thread can never succeed, seccomp_can_sync_threads() will
    check a zombie leader and is_ancestor() will fail.
    Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarAndrei Vagin <avagin@google.com>
    Link: https://lore.kernel.org/r/20240628021014.231976-3-avagin@google.comReviewed-by: default avatarTycho Andersen <tandersen@netflix.com>
    Signed-off-by: default avatarKees Cook <kees@kernel.org>
    bfafe5ef
seccomp.c 65.2 KB