diff options
| -rw-r--r-- | fs/proc/array.c | 10 | ||||
| -rw-r--r-- | fs/proc/base.c | 16 | ||||
| -rw-r--r-- | fs/proc/inode.c | 4 | ||||
| -rw-r--r-- | fs/proc/root.c | 2 | ||||
| -rw-r--r-- | include/linux/pid_namespace.h | 2 | ||||
| -rw-r--r-- | include/linux/proc_fs.h | 4 | ||||
| -rw-r--r-- | init/Kconfig | 1 | 
7 files changed, 22 insertions, 17 deletions
diff --git a/fs/proc/array.c b/fs/proc/array.c index 36a0a9192ec..dc4c5a7b9ec 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -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) diff --git a/fs/proc/base.c b/fs/proc/base.c index 2ee514c7e64..c47904994b7 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -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; diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 205c9228083..554ecc54799 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -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); diff --git a/fs/proc/root.c b/fs/proc/root.c index 46a15d8a29c..df4e4561dbb 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c @@ -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)) diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h index b067bd8c49d..00474b04714 100644 --- a/include/linux/pid_namespace.h +++ b/include/linux/pid_namespace.h @@ -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 */  }; diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 85c50730623..3fd2e871ff1 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -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;  	/* diff --git a/init/Kconfig b/init/Kconfig index 0e7d30ba8eb..7bebe91367c 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -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  |