diff --git a/fs/pidfs.c b/fs/pidfs.c index 66c1046e2929..114d2713a79e 100644 --- a/fs/pidfs.c +++ b/fs/pidfs.c @@ -511,6 +511,14 @@ static long pidfd_info(struct file *file, unsigned int cmd, unsigned long arg) kinfo.supported_mask = PIDFD_INFO_SUPPORTED; } + /* Only report fields that fit into the caller's struct. */ + if (usize < PIDFD_INFO_SIZE_VER1) + kinfo.mask &= ~(PIDFD_INFO_COREDUMP | PIDFD_INFO_COREDUMP_SIGNAL); + if (usize < PIDFD_INFO_SIZE_VER2) + kinfo.mask &= ~PIDFD_INFO_COREDUMP_CODE; + if (usize < PIDFD_INFO_SIZE_VER3) + kinfo.mask &= ~PIDFD_INFO_SUPPORTED_MASK; + /* Are there bits in the return mask not present in PIDFD_INFO_SUPPORTED? */ WARN_ON_ONCE(~PIDFD_INFO_SUPPORTED & kinfo.mask); /*