]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
pidfs: preserve thread pidfds reopened by file handle
authorChristian Brauner <brauner@kernel.org>
Wed, 22 Jul 2026 11:50:53 +0000 (13:50 +0200)
committerChristian Brauner <brauner@kernel.org>
Wed, 22 Jul 2026 11:55:20 +0000 (13:55 +0200)
PIDFD_THREAD shares O_EXCL. do_dentry_open() clears O_EXCL after
pidfs_export_open() validates the flags, so open_by_handle_at()
silently turns a thread pidfd into a process pidfd.

Restore PIDFD_THREAD on the opened file, matching pidfs_alloc_file().

Signed-off-by: Li Chen <me@linux.beauty>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://patch.msgid.link/20260716052726.1032092-1-me@linux.beauty
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
fs/pidfs.c

index aaa609ddab044355ff00ffdd1eff34657ecc1b4c..c20ffd747ff5119cfbcb159da28b6b12ff8a1577 100644 (file)
@@ -939,12 +939,18 @@ static int pidfs_export_permission(struct handle_to_path_ctx *ctx,
 
 static struct file *pidfs_export_open(const struct path *path, unsigned int oflags)
 {
+       struct file *file;
+
        /*
         * Clear O_LARGEFILE as open_by_handle_at() forces it and raise
         * O_RDWR as pidfds always are.
         */
        oflags &= ~O_LARGEFILE;
-       return dentry_open(path, oflags | O_RDWR, current_cred());
+       file = dentry_open(path, oflags | O_RDWR, current_cred());
+       /* do_dentry_open() strips O_EXCL, which encodes PIDFD_THREAD. */
+       if (!IS_ERR(file))
+               file->f_flags |= oflags & PIDFD_THREAD;
+       return file;
 }
 
 static const struct export_operations pidfs_export_operations = {