Merge tag 'vfs-6.10.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[linux-2.6-block.git] / fs / proc / fd.c
index 6e72e5ad42bc74b8f7135c00ce5bca93b1dcb8ac..f4b1c8b42a511320f6586a6ccd530b17d990aa42 100644 (file)
@@ -74,7 +74,18 @@ out:
        return 0;
 }
 
-static int proc_fdinfo_access_allowed(struct inode *inode)
+static int seq_fdinfo_open(struct inode *inode, struct file *file)
+{
+       return single_open(file, seq_show, inode);
+}
+
+/**
+ * Shared /proc/pid/fdinfo and /proc/pid/fdinfo/fd permission helper to ensure
+ * that the current task has PTRACE_MODE_READ in addition to the normal
+ * POSIX-like checks.
+ */
+static int proc_fdinfo_permission(struct mnt_idmap *idmap, struct inode *inode,
+                                 int mask)
 {
        bool allowed = false;
        struct task_struct *task = get_proc_task(inode);
@@ -88,18 +99,13 @@ static int proc_fdinfo_access_allowed(struct inode *inode)
        if (!allowed)
                return -EACCES;
 
-       return 0;
+       return generic_permission(idmap, inode, mask);
 }
 
-static int seq_fdinfo_open(struct inode *inode, struct file *file)
-{
-       int ret = proc_fdinfo_access_allowed(inode);
-
-       if (ret)
-               return ret;
-
-       return single_open(file, seq_show, inode);
-}
+static const struct inode_operations proc_fdinfo_file_inode_operations = {
+       .permission     = proc_fdinfo_permission,
+       .setattr        = proc_setattr,
+};
 
 static const struct file_operations proc_fdinfo_file_operations = {
        .open           = seq_fdinfo_open,
@@ -388,6 +394,8 @@ static struct dentry *proc_fdinfo_instantiate(struct dentry *dentry,
        ei = PROC_I(inode);
        ei->fd = data->fd;
 
+       inode->i_op = &proc_fdinfo_file_inode_operations;
+
        inode->i_fop = &proc_fdinfo_file_operations;
        tid_fd_update_inode(task, inode, 0);
 
@@ -407,23 +415,13 @@ static int proc_readfdinfo(struct file *file, struct dir_context *ctx)
                                  proc_fdinfo_instantiate);
 }
 
-static int proc_open_fdinfo(struct inode *inode, struct file *file)
-{
-       int ret = proc_fdinfo_access_allowed(inode);
-
-       if (ret)
-               return ret;
-
-       return 0;
-}
-
 const struct inode_operations proc_fdinfo_inode_operations = {
        .lookup         = proc_lookupfdinfo,
+       .permission     = proc_fdinfo_permission,
        .setattr        = proc_setattr,
 };
 
 const struct file_operations proc_fdinfo_operations = {
-       .open           = proc_open_fdinfo,
        .read           = generic_read_dir,
        .iterate_shared = proc_readfdinfo,
        .llseek         = generic_file_llseek,