• Christian Brauner's avatar
    samples: show race-free pidfd metadata access · 43c6afee
    Christian Brauner authored
    This is a sample program showing userspace how to get race-free access
    to process metadata from a pidfd.  It is rather easy to do and userspace
    can actually simply reuse code that currently parses a process's status
    file in procfs.
    The program can easily be extended into a generic helper suitable for
    inclusion in a libc to make it even easier for userspace to gain metadata
    access.
    
    Since this came up in a discussion because this API is going to be used
    in various service managers: A lot of programs will have a whitelist
    seccomp filter that returns <some-errno> for all new syscalls.  This
    means that programs might get confused if CLONE_PIDFD works but the
    later pidfd_send_signal() syscall doesn't.  Hence, here's a ahead of
    time check that pidfd_send_signal() is supported:
    
    bool pidfd_send_signal_supported()
    {
            int procfd = open("/proc/self", O_DIRECTORY | O_RDONLY | O_CLOEXEC);
            if (procfd < 0)
                    return false;
    
            /*
             * A process is always allowed to signal itself so
             * pidfd_send_signal() should never fail this test. If it does
             * it must mean it is not available, blocked by an LSM, seccomp,
             * or other.
             */
            return pidfd_send_signal(procfd, 0, NULL, 0) == 0;
    }
    Signed-off-by: default avatarChristian Brauner <christian@brauner.io>
    Co-developed-by: default avatarJann Horn <jannh@google.com>
    Signed-off-by: default avatarJann Horn <jannh@google.com>
    Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: Kees Cook <keescook@chromium.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: David Howells <dhowells@redhat.com>
    Cc: "Michael Kerrisk (man-pages)" <mtk.manpages@gmail.com>
    Cc: Andy Lutomirsky <luto@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Aleksa Sarai <cyphar@cyphar.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    43c6afee
pidfd-metadata.c 2.16 KB