lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAJqdLrqasST2rf+TNvNarmP2fnp-7xD3dmOoBU0dRqQoqot37A@mail.gmail.com>
Date: Mon, 3 Nov 2025 16:38:24 +0100
From: Alexander Mikhalitsyn <alexander@...alicyn.com>
To: Christian Brauner <brauner@...nel.org>
Cc: linux-fsdevel@...r.kernel.org, Oleg Nesterov <oleg@...hat.com>, 
	Amir Goldstein <amir73il@...il.com>, Aleksa Sarai <cyphar@...har.com>, 
	Yu Watanabe <watanabe.yu+github@...il.com>, Josef Bacik <josef@...icpanda.com>, 
	Jeff Layton <jlayton@...nel.org>, Jann Horn <jannh@...gle.com>, 
	Luca Boccassi <luca.boccassi@...il.com>, linux-kernel@...r.kernel.org, 
	Alexander Viro <viro@...iv.linux.org.uk>, Jan Kara <jack@...e.cz>, 
	Lennart Poettering <lennart@...ttering.net>, Mike Yuan <me@...dnzj.com>, 
	Zbigniew Jędrzejewski-Szmek <zbyszek@...waw.pl>
Subject: Re: [PATCH 05/22] pidfd: add a new supported_mask field

Am Di., 28. Okt. 2025 um 09:46 Uhr schrieb Christian Brauner
<brauner@...nel.org>:
>
> Some of the future fields in struct pidfd_info can be optional. If the
> kernel has nothing to emit in that field, then it doesn't set the flag
> in the reply. This presents a problem: There is currently no way to know
> what mask flags the kernel supports since one can't always count on them
> being in the reply.
>
> Add a new PIDFD_INFO_SUPPORTED_MASK flag and field that the kernel can
> set in the reply. Userspace can use this to determine if the fields it
> requires from the kernel are supported. This also gives us a way to
> deprecate fields in the future, if that should become necessary.
>
> Signed-off-by: Christian Brauner <brauner@...nel.org>

Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@...onical.com>

> ---
>  fs/pidfs.c                 | 17 ++++++++++++++++-
>  include/uapi/linux/pidfd.h |  3 +++
>  2 files changed, 19 insertions(+), 1 deletion(-)
>
> diff --git a/fs/pidfs.c b/fs/pidfs.c
> index 7e4d90cc74ff..204ebd32791a 100644
> --- a/fs/pidfs.c
> +++ b/fs/pidfs.c
> @@ -293,6 +293,14 @@ static __u32 pidfs_coredump_mask(unsigned long mm_flags)
>         return 0;
>  }
>
> +/* This must be updated whenever a new flag is added */
> +#define PIDFD_INFO_SUPPORTED (PIDFD_INFO_PID | \
> +                             PIDFD_INFO_CREDS | \
> +                             PIDFD_INFO_CGROUPID | \
> +                             PIDFD_INFO_EXIT | \
> +                             PIDFD_INFO_COREDUMP | \
> +                             PIDFD_INFO_SUPPORTED_MASK)
> +
>  static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
>  {
>         struct pidfd_info __user *uinfo = (struct pidfd_info __user *)arg;
> @@ -306,7 +314,7 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
>         const struct cred *c;
>         __u64 mask;
>
> -       BUILD_BUG_ON(sizeof(struct pidfd_info) != PIDFD_INFO_SIZE_VER1);
> +       BUILD_BUG_ON(sizeof(struct pidfd_info) != PIDFD_INFO_SIZE_VER2);
>
>         if (!uinfo)
>                 return -EINVAL;
> @@ -412,6 +420,13 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
>                 return -ESRCH;
>
>  copy_out:
> +       if (mask & PIDFD_INFO_SUPPORTED_MASK) {
> +               kinfo.mask |= PIDFD_INFO_SUPPORTED_MASK;
> +               kinfo.supported_mask = PIDFD_INFO_SUPPORTED;
> +       }
> +
> +       /* Are there bits in the return mask not present in PIDFD_INFO_SUPPORTED? */
> +       WARN_ON_ONCE(~PIDFD_INFO_SUPPORTED & kinfo.mask);
>         /*
>          * If userspace and the kernel have the same struct size it can just
>          * be copied. If userspace provides an older struct, only the bits that
> diff --git a/include/uapi/linux/pidfd.h b/include/uapi/linux/pidfd.h
> index 6ccbabd9a68d..e05caa0e00fe 100644
> --- a/include/uapi/linux/pidfd.h
> +++ b/include/uapi/linux/pidfd.h
> @@ -26,9 +26,11 @@
>  #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_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 */
>
>  /*
>   * Values for @coredump_mask in pidfd_info.
> @@ -94,6 +96,7 @@ struct pidfd_info {
>         __s32 exit_code;
>         __u32 coredump_mask;
>         __u32 __spare1;
> +       __u64 supported_mask;   /* Mask flags that this kernel supports */
>  };
>
>  #define PIDFS_IOCTL_MAGIC 0xFF
>
> --
> 2.47.3
>

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ