mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 02:24:24 +02:00
pidfs: remove pidfs_pid_valid()
The validation is now completely handled in path_from_stashed(). Link: https://lore.kernel.org/20250618-work-pidfs-persistent-v2-9-98f3456fd552@kernel.org Reviewed-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@canonical.com> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
804d679449
commit
d718249bba
53
fs/pidfs.c
53
fs/pidfs.c
|
|
@ -804,58 +804,8 @@ static int pidfs_export_permission(struct handle_to_path_ctx *ctx,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline bool pidfs_pid_valid(struct pid *pid, const struct path *path,
|
||||
unsigned int flags)
|
||||
{
|
||||
enum pid_type type;
|
||||
|
||||
if (flags & PIDFD_STALE)
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Make sure that if a pidfd is created PIDFD_INFO_EXIT
|
||||
* information will be available. So after an inode for the
|
||||
* pidfd has been allocated perform another check that the pid
|
||||
* is still alive. If it is exit information is available even
|
||||
* if the task gets reaped before the pidfd is returned to
|
||||
* userspace. The only exception are indicated by PIDFD_STALE:
|
||||
*
|
||||
* (1) The kernel is in the middle of task creation and thus no
|
||||
* task linkage has been established yet.
|
||||
* (2) The caller knows @pid has been registered in pidfs at a
|
||||
* time when the task was still alive.
|
||||
*
|
||||
* In both cases exit information will have been reported.
|
||||
*/
|
||||
if (flags & PIDFD_THREAD)
|
||||
type = PIDTYPE_PID;
|
||||
else
|
||||
type = PIDTYPE_TGID;
|
||||
|
||||
/*
|
||||
* Since pidfs_exit() is called before struct pid's task linkage
|
||||
* is removed the case where the task got reaped but a dentry
|
||||
* was already attached to struct pid and exit information was
|
||||
* recorded and published can be handled correctly.
|
||||
*/
|
||||
if (unlikely(!pid_has_task(pid, type))) {
|
||||
struct pidfs_attr *attr;
|
||||
|
||||
attr = READ_ONCE(pid->attr);
|
||||
if (!attr)
|
||||
return false;
|
||||
if (!READ_ONCE(attr->exit_info))
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static struct file *pidfs_export_open(struct path *path, unsigned int oflags)
|
||||
{
|
||||
if (!pidfs_pid_valid(d_inode(path->dentry)->i_private, path, oflags))
|
||||
return ERR_PTR(-ESRCH);
|
||||
|
||||
/*
|
||||
* Clear O_LARGEFILE as open_by_handle_at() forces it and raise
|
||||
* O_RDWR as pidfds always are.
|
||||
|
|
@ -993,9 +943,6 @@ struct file *pidfs_alloc_file(struct pid *pid, unsigned int flags)
|
|||
if (ret < 0)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
if (!pidfs_pid_valid(pid, &path, flags))
|
||||
return ERR_PTR(-ESRCH);
|
||||
|
||||
flags &= ~PIDFD_STALE;
|
||||
flags |= O_RDWR;
|
||||
pidfd_file = dentry_open(&path, flags, current_cred());
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user