userns: Convert proc to use kuid/kgid where appropriate
authorEric W. Biederman <ebiederm@xmission.com>
Thu, 9 Feb 2012 16:48:21 +0000 (08:48 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Tue, 15 May 2012 21:59:28 +0000 (14:59 -0700)
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
fs/proc/array.c
fs/proc/base.c
fs/proc/inode.c
fs/proc/root.c
include/linux/pid_namespace.h
include/linux/proc_fs.h
init/Kconfig

index 36a0a9192ece07c4ca1e574aaa9322b3794c2fb7..dc4c5a7b9eceb767c0d7305ce5e1b609cdcdaef3 100644 (file)
@@ -191,8 +191,14 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns,
                task_tgid_nr_ns(p, ns),
                pid_nr_ns(pid, ns),
                ppid, tpid,
-               cred->uid, cred->euid, cred->suid, cred->fsuid,
-               cred->gid, cred->egid, cred->sgid, cred->fsgid);
+               from_kuid_munged(user_ns, cred->uid),
+               from_kuid_munged(user_ns, cred->euid),
+               from_kuid_munged(user_ns, cred->suid),
+               from_kuid_munged(user_ns, cred->fsuid),
+               from_kgid_munged(user_ns, cred->gid),
+               from_kgid_munged(user_ns, cred->egid),
+               from_kgid_munged(user_ns, cred->sgid),
+               from_kgid_munged(user_ns, cred->fsgid));
 
        task_lock(p);
        if (p->files)
index 2ee514c7e64a7a601e756116d4dd541c7bc778bb..c47904994b78248fc1984914eab3b3c382952139 100644 (file)
@@ -1562,8 +1562,8 @@ int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
        generic_fillattr(inode, stat);
 
        rcu_read_lock();
-       stat->uid = 0;
-       stat->gid = 0;
+       stat->uid = GLOBAL_ROOT_UID;
+       stat->gid = GLOBAL_ROOT_GID;
        task = pid_task(proc_pid(inode), PIDTYPE_PID);
        if (task) {
                if (!has_pid_permissions(pid, task, 2)) {
@@ -1623,8 +1623,8 @@ int pid_revalidate(struct dentry *dentry, struct nameidata *nd)
                        inode->i_gid = cred->egid;
                        rcu_read_unlock();
                } else {
-                       inode->i_uid = 0;
-                       inode->i_gid = 0;
+                       inode->i_uid = GLOBAL_ROOT_UID;
+                       inode->i_gid = GLOBAL_ROOT_GID;
                }
                inode->i_mode &= ~(S_ISUID | S_ISGID);
                security_task_to_inode(task, inode);
@@ -1811,8 +1811,8 @@ static int tid_fd_revalidate(struct dentry *dentry, struct nameidata *nd)
                                        inode->i_gid = cred->egid;
                                        rcu_read_unlock();
                                } else {
-                                       inode->i_uid = 0;
-                                       inode->i_gid = 0;
+                                       inode->i_uid = GLOBAL_ROOT_UID;
+                                       inode->i_gid = GLOBAL_ROOT_GID;
                                }
                                inode->i_mode &= ~(S_ISUID | S_ISGID);
                                security_task_to_inode(task, inode);
@@ -2061,8 +2061,8 @@ static int map_files_d_revalidate(struct dentry *dentry, struct nameidata *nd)
                        inode->i_gid = cred->egid;
                        rcu_read_unlock();
                } else {
-                       inode->i_uid = 0;
-                       inode->i_gid = 0;
+                       inode->i_uid = GLOBAL_ROOT_UID;
+                       inode->i_gid = GLOBAL_ROOT_GID;
                }
                security_task_to_inode(task, inode);
                status = 1;
index 205c92280838936d6402fa42792177748fd79ad8..554ecc54799fff058067c19d2261d56bbc6391d7 100644 (file)
@@ -108,8 +108,8 @@ static int proc_show_options(struct seq_file *seq, struct dentry *root)
        struct super_block *sb = root->d_sb;
        struct pid_namespace *pid = sb->s_fs_info;
 
-       if (pid->pid_gid)
-               seq_printf(seq, ",gid=%lu", (unsigned long)pid->pid_gid);
+       if (!gid_eq(pid->pid_gid, GLOBAL_ROOT_GID))
+               seq_printf(seq, ",gid=%u", from_kgid_munged(&init_user_ns, pid->pid_gid));
        if (pid->hide_pid != 0)
                seq_printf(seq, ",hidepid=%u", pid->hide_pid);
 
index 46a15d8a29ca74d9ca0a68a57e416108e6b599f3..df4e4561dbbf3c1497c7ebf9a524cd190acc9821 100644 (file)
@@ -67,7 +67,7 @@ static int proc_parse_options(char *options, struct pid_namespace *pid)
                case Opt_gid:
                        if (match_int(&args[0], &option))
                                return 0;
-                       pid->pid_gid = option;
+                       pid->pid_gid = make_kgid(current_user_ns(), option);
                        break;
                case Opt_hidepid:
                        if (match_int(&args[0], &option))
index b067bd8c49d0ef9ed7e277ba0bb8564afafb48e6..00474b047145ed1f54f3003fe597873a4665cc48 100644 (file)
@@ -31,7 +31,7 @@ struct pid_namespace {
 #ifdef CONFIG_BSD_PROCESS_ACCT
        struct bsd_acct_struct *bacct;
 #endif
-       gid_t pid_gid;
+       kgid_t pid_gid;
        int hide_pid;
        int reboot;     /* group exit code if this pidns was rebooted */
 };
index 85c5073062390b3b1129f1d5af9ec0c8ed1c4f5e..3fd2e871ff1bfbd23fae57c536d8b247c19ef131 100644 (file)
@@ -52,8 +52,8 @@ struct proc_dir_entry {
        unsigned int low_ino;
        umode_t mode;
        nlink_t nlink;
-       uid_t uid;
-       gid_t gid;
+       kuid_t uid;
+       kgid_t gid;
        loff_t size;
        const struct inode_operations *proc_iops;
        /*
index 0e7d30ba8ebb4bbfbf317327e01f77a00fd7c095..7bebe91367c51e19cadcaab28544301a1f7d6f53 100644 (file)
@@ -948,7 +948,6 @@ config UIDGID_CONVERTED
        depends on NTFS_FS = n
        depends on OCFS2_FS = n
        depends on OMFS_FS = n
-       depends on PROC_FS = n
        depends on PROC_SYSCTL = n
        depends on QNX4FS_FS = n
        depends on QNX6FS_FS = n