diff --git a/src/include/override/linux/fcntl.h b/src/include/override/linux/fcntl.h new file mode 100644 index 0000000000..c2afd9c99b --- /dev/null +++ b/src/include/override/linux/fcntl.h @@ -0,0 +1,10 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +/* We do not use linux/fcntl.h as it conflicts with glibc's fcntl.h. */ +#include + +/* The below are defined in linux/fcntl.h, but not defined in glibc's fcntl.h. + * They are necessary for linux/pidfd.h, hence define them here. */ +#define PIDFD_SELF_THREAD -10000 /* Current thread. */ +#define PIDFD_SELF_THREAD_GROUP -10001 /* Current thread group leader. */ diff --git a/src/include/override/sys/pidfd.h b/src/include/override/sys/pidfd.h index 28fb75698e..0f4d243d18 100644 --- a/src/include/override/sys/pidfd.h +++ b/src/include/override/sys/pidfd.h @@ -1,9 +1,9 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include +/* Here, we do not use glibc's pidfd.h, as its definition of struct pidfd_info may be slightly older. */ +#include #include -#include /* Defined since glibc-2.36. * Supported since kernel v5.3 (7615d9e1780e26e0178c93c55b73309a5dc093d7). */ @@ -14,102 +14,3 @@ int pidfd_open_shim(pid_t pid, unsigned flags); * Supported since kernel v5.1 (3eb39f47934f9d5a3027fe00d906a45fe3a15fad). */ int pidfd_send_signal_shim(int fd, int sig, siginfo_t *info, unsigned flags); #define pidfd_send_signal pidfd_send_signal_shim - -/* since glibc-2.41 */ -#ifndef PIDFS_IOCTL_MAGIC -# define PIDFS_IOCTL_MAGIC 0xFF - -# define PIDFD_GET_CGROUP_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 1) -# define PIDFD_GET_IPC_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 2) -# define PIDFD_GET_MNT_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 3) -# define PIDFD_GET_NET_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 4) -# define PIDFD_GET_PID_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 5) -# define PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 6) -# define PIDFD_GET_TIME_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 7) -# define PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 8) -# define PIDFD_GET_USER_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 9) -# define PIDFD_GET_UTS_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 10) -#endif - -/* defined in linux/pidfd.h */ -#ifndef PIDFD_GET_INFO - -/* Flags for pidfd_info. */ -#define PIDFD_INFO_PID (1UL << 0) /* Always returned, even if not requested */ -#define PIDFD_INFO_CREDS (1UL << 1) /* Always returned, even if not requested */ -#define PIDFD_INFO_CGROUPID (1UL << 2) /* Always returned if available, even if not requested */ -#define PIDFD_INFO_EXIT (1UL << 3) /* Only returned if requested. */ -#define PIDFD_INFO_COREDUMP (1UL << 4) /* Only returned if requested. */ -#define PIDFD_INFO_SUPPORTED_MASK (1UL << 5) /* Want/got supported mask flags */ -#define PIDFD_INFO_COREDUMP_SIGNAL (1UL << 6) /* Always returned if PIDFD_INFO_COREDUMP is requested. */ -#define PIDFD_INFO_COREDUMP_CODE (1UL << 7) /* Always returned if PIDFD_INFO_COREDUMP is requested. */ - -#define PIDFD_INFO_SIZE_VER0 64 /* sizeof first published struct */ -#define PIDFD_INFO_SIZE_VER1 72 /* sizeof second published struct */ -#define PIDFD_INFO_SIZE_VER2 80 /* sizeof third published struct */ -#define PIDFD_INFO_SIZE_VER3 88 /* sizeof fourth published struct */ - -/* - * Values for @coredump_mask in pidfd_info. - * Only valid if PIDFD_INFO_COREDUMP is set in @mask. - * - * Note, the @PIDFD_COREDUMP_ROOT flag indicates that the generated - * coredump should be treated as sensitive and access should only be - * granted to privileged users. - */ -#define PIDFD_COREDUMPED (1U << 0) /* Did crash and... */ -#define PIDFD_COREDUMP_SKIP (1U << 1) /* coredumping generation was skipped. */ -#define PIDFD_COREDUMP_USER (1U << 2) /* coredump was done as the user. */ -#define PIDFD_COREDUMP_ROOT (1U << 3) /* coredump was done as root. */ - -struct pidfd_info { - /* - * This mask is similar to the request_mask in statx(2). - * - * Userspace indicates what extensions or expensive-to-calculate fields - * they want by setting the corresponding bits in mask. The kernel - * will ignore bits that it does not know about. - * - * When filling the structure, the kernel will only set bits - * corresponding to the fields that were actually filled by the kernel. - * This also includes any future extensions that might be automatically - * filled. If the structure size is too small to contain a field - * (requested or not), to avoid confusion the mask will not - * contain a bit for that field. - * - * As such, userspace MUST verify that mask contains the - * corresponding flags after the ioctl(2) returns to ensure that it is - * using valid data. - */ - __u64 mask; - /* - * The information contained in the following fields might be stale at the - * time it is received, as the target process might have exited as soon as - * the IOCTL was processed, and there is no way to avoid that. However, it - * is guaranteed that if the call was successful, then the information was - * correct and referred to the intended process at the time the work was - * performed. */ - __u64 cgroupid; - __u32 pid; - __u32 tgid; - __u32 ppid; - __u32 ruid; - __u32 rgid; - __u32 euid; - __u32 egid; - __u32 suid; - __u32 sgid; - __u32 fsuid; - __u32 fsgid; - __s32 exit_code; /* since kernel v6.15 (7477d7dce48a996ae4e4f0b5f7bd82de7ec9131b) */ - struct { /* coredump info */ - __u32 coredump_mask; /* since kernel v6.16 (1d8db6fd698de1f73b1a7d72aea578fdd18d9a87) */ - __u32 coredump_signal; /* since kernel v6.19 (036375522be8425874e9e0f907c7127e315c7a52) */ - __u32 coredump_code; /* since kernel v7.1 (701f7f4fbabbf4989ba6fbf033b160dd943221d5) */ - __u32 coredump_pad; /* since kernel v7.1 (701f7f4fbabbf4989ba6fbf033b160dd943221d5) */ - }; - __u64 supported_mask; /* Mask flags that this kernel supports */ -}; - -#define PIDFD_GET_INFO _IOWR(PIDFS_IOCTL_MAGIC, 11, struct pidfd_info) -#endif /* PIDFD_GET_INFO */ diff --git a/src/include/uapi/linux/ioctl.h b/src/include/uapi/linux/ioctl.h new file mode 100644 index 0000000000..b292e8093b --- /dev/null +++ b/src/include/uapi/linux/ioctl.h @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ +#ifndef _LINUX_IOCTL_H +#define _LINUX_IOCTL_H + +#include + +#endif /* _LINUX_IOCTL_H */ + diff --git a/src/include/uapi/linux/pidfd.h b/src/include/uapi/linux/pidfd.h new file mode 100644 index 0000000000..69873fffdf --- /dev/null +++ b/src/include/uapi/linux/pidfd.h @@ -0,0 +1,119 @@ +/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ + +#ifndef _LINUX_PIDFD_H +#define _LINUX_PIDFD_H + +#include +#include +#include + +/* Flags for pidfd_open(). */ +#define PIDFD_NONBLOCK O_NONBLOCK +#define PIDFD_THREAD O_EXCL + +/* Flags for pidfd_send_signal(). */ +#define PIDFD_SIGNAL_THREAD (1UL << 0) +#define PIDFD_SIGNAL_THREAD_GROUP (1UL << 1) +#define PIDFD_SIGNAL_PROCESS_GROUP (1UL << 2) + +/* Flags for pidfd_info. */ +#define PIDFD_INFO_PID (1UL << 0) /* Always returned, even if not requested */ +#define PIDFD_INFO_CREDS (1UL << 1) /* Always returned, even if not requested */ +#define PIDFD_INFO_CGROUPID (1UL << 2) /* Always returned if available, even if not requested */ +#define PIDFD_INFO_EXIT (1UL << 3) /* Only returned if requested. */ +#define PIDFD_INFO_COREDUMP (1UL << 4) /* Only returned if requested. */ +#define PIDFD_INFO_SUPPORTED_MASK (1UL << 5) /* Want/got supported mask flags */ +#define PIDFD_INFO_COREDUMP_SIGNAL (1UL << 6) /* Always returned if PIDFD_INFO_COREDUMP is requested. */ +#define PIDFD_INFO_COREDUMP_CODE (1UL << 7) /* Always returned if PIDFD_INFO_COREDUMP is requested. */ + +#define PIDFD_INFO_SIZE_VER0 64 /* sizeof first published struct */ +#define PIDFD_INFO_SIZE_VER1 72 /* sizeof second published struct */ +#define PIDFD_INFO_SIZE_VER2 80 /* sizeof third published struct */ +#define PIDFD_INFO_SIZE_VER3 88 /* sizeof fourth published struct */ + +/* + * Values for @coredump_mask in pidfd_info. + * Only valid if PIDFD_INFO_COREDUMP is set in @mask. + * + * Note, the @PIDFD_COREDUMP_ROOT flag indicates that the generated + * coredump should be treated as sensitive and access should only be + * granted to privileged users. + */ +#define PIDFD_COREDUMPED (1U << 0) /* Did crash and... */ +#define PIDFD_COREDUMP_SKIP (1U << 1) /* coredumping generation was skipped. */ +#define PIDFD_COREDUMP_USER (1U << 2) /* coredump was done as the user. */ +#define PIDFD_COREDUMP_ROOT (1U << 3) /* coredump was done as root. */ + +/* + * ...and for userland we make life simpler - PIDFD_SELF refers to the current + * thread, PIDFD_SELF_PROCESS refers to the process thread group leader. + * + * For nearly all practical uses, a user will want to use PIDFD_SELF. + */ +#define PIDFD_SELF PIDFD_SELF_THREAD +#define PIDFD_SELF_PROCESS PIDFD_SELF_THREAD_GROUP + +struct pidfd_info { + /* + * This mask is similar to the request_mask in statx(2). + * + * Userspace indicates what extensions or expensive-to-calculate fields + * they want by setting the corresponding bits in mask. The kernel + * will ignore bits that it does not know about. + * + * When filling the structure, the kernel will only set bits + * corresponding to the fields that were actually filled by the kernel. + * This also includes any future extensions that might be automatically + * filled. If the structure size is too small to contain a field + * (requested or not), to avoid confusion the mask will not + * contain a bit for that field. + * + * As such, userspace MUST verify that mask contains the + * corresponding flags after the ioctl(2) returns to ensure that it is + * using valid data. + */ + __u64 mask; + /* + * The information contained in the following fields might be stale at the + * time it is received, as the target process might have exited as soon as + * the IOCTL was processed, and there is no way to avoid that. However, it + * is guaranteed that if the call was successful, then the information was + * correct and referred to the intended process at the time the work was + * performed. */ + __u64 cgroupid; + __u32 pid; + __u32 tgid; + __u32 ppid; + __u32 ruid; + __u32 rgid; + __u32 euid; + __u32 egid; + __u32 suid; + __u32 sgid; + __u32 fsuid; + __u32 fsgid; + __s32 exit_code; + struct /* coredump info */ { + __u32 coredump_mask; + __u32 coredump_signal; + __u32 coredump_code; + __u32 coredump_pad; /* align supported_mask to 8 bytes */ + }; + __u64 supported_mask; /* Mask flags that this kernel supports */ +}; + +#define PIDFS_IOCTL_MAGIC 0xFF + +#define PIDFD_GET_CGROUP_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 1) +#define PIDFD_GET_IPC_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 2) +#define PIDFD_GET_MNT_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 3) +#define PIDFD_GET_NET_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 4) +#define PIDFD_GET_PID_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 5) +#define PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 6) +#define PIDFD_GET_TIME_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 7) +#define PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 8) +#define PIDFD_GET_USER_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 9) +#define PIDFD_GET_UTS_NAMESPACE _IO(PIDFS_IOCTL_MAGIC, 10) +#define PIDFD_GET_INFO _IOWR(PIDFS_IOCTL_MAGIC, 11, struct pidfd_info) + +#endif /* _LINUX_PIDFD_H */