[PATCH 02/22] pidfs: fix PIDFD_INFO_COREDUMP handling

Christian Brauner posted 22 patches 3 months, 1 week ago
[PATCH 02/22] pidfs: fix PIDFD_INFO_COREDUMP handling
Posted by Christian Brauner 3 months, 1 week ago
When PIDFD_INFO_COREDUMP is requested we raise it unconditionally in the
returned mask even if no coredump actually did take place. This was
done because we assumed that the later check whether ->coredump_mask as
non-zero detects that it is zero and then retrieves the dumpability
settings from the task's mm. This has issues though becuase there are
tasks that might not have any mm. Also it's just not very cleanly
implemented. Fix this.

Signed-off-by: Christian Brauner <brauner@kernel.org>
---
 fs/pidfs.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/fs/pidfs.c b/fs/pidfs.c
index c2f0b7091cd7..c0f410903c3f 100644
--- a/fs/pidfs.c
+++ b/fs/pidfs.c
@@ -335,8 +335,9 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
 	}
 
 	if (mask & PIDFD_INFO_COREDUMP) {
-		kinfo.mask |= PIDFD_INFO_COREDUMP;
 		kinfo.coredump_mask = READ_ONCE(attr->__pei.coredump_mask);
+		if (kinfo.coredump_mask)
+			kinfo.mask |= PIDFD_INFO_COREDUMP;
 	}
 
 	task = get_pid_task(pid, PIDTYPE_PID);
@@ -355,12 +356,13 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
 	if (!c)
 		return -ESRCH;
 
-	if ((kinfo.mask & PIDFD_INFO_COREDUMP) && !(kinfo.coredump_mask)) {
+	if ((mask & PIDFD_INFO_COREDUMP) && !kinfo.coredump_mask) {
 		guard(task_lock)(task);
 		if (task->mm) {
 			unsigned long flags = __mm_flags_get_dumpable(task->mm);
 
 			kinfo.coredump_mask = pidfs_coredump_mask(flags);
+			kinfo.mask |= PIDFD_INFO_COREDUMP;
 		}
 	}
 

-- 
2.47.3
Re: [PATCH 02/22] pidfs: fix PIDFD_INFO_COREDUMP handling
Posted by Alexander Mikhalitsyn 3 months, 1 week ago
Am Di., 28. Okt. 2025 um 09:46 Uhr schrieb Christian Brauner
<brauner@kernel.org>:
>
> When PIDFD_INFO_COREDUMP is requested we raise it unconditionally in the
> returned mask even if no coredump actually did take place. This was
> done because we assumed that the later check whether ->coredump_mask as
> non-zero detects that it is zero and then retrieves the dumpability
> settings from the task's mm. This has issues though becuase there are
> tasks that might not have any mm. Also it's just not very cleanly
> implemented. Fix this.
>
> Signed-off-by: Christian Brauner <brauner@kernel.org>

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

> ---
>  fs/pidfs.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/fs/pidfs.c b/fs/pidfs.c
> index c2f0b7091cd7..c0f410903c3f 100644
> --- a/fs/pidfs.c
> +++ b/fs/pidfs.c
> @@ -335,8 +335,9 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
>         }
>
>         if (mask & PIDFD_INFO_COREDUMP) {
> -               kinfo.mask |= PIDFD_INFO_COREDUMP;
>                 kinfo.coredump_mask = READ_ONCE(attr->__pei.coredump_mask);
> +               if (kinfo.coredump_mask)
> +                       kinfo.mask |= PIDFD_INFO_COREDUMP;
>         }
>
>         task = get_pid_task(pid, PIDTYPE_PID);
> @@ -355,12 +356,13 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg)
>         if (!c)
>                 return -ESRCH;
>
> -       if ((kinfo.mask & PIDFD_INFO_COREDUMP) && !(kinfo.coredump_mask)) {
> +       if ((mask & PIDFD_INFO_COREDUMP) && !kinfo.coredump_mask) {
>                 guard(task_lock)(task);
>                 if (task->mm) {
>                         unsigned long flags = __mm_flags_get_dumpable(task->mm);
>
>                         kinfo.coredump_mask = pidfs_coredump_mask(flags);
> +                       kinfo.mask |= PIDFD_INFO_COREDUMP;
>                 }
>         }
>
>
> --
> 2.47.3
>