aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2012-02-07 19:22:56 -0500
committerEric W. Biederman <ebiederm@xmission.com>2012-05-15 17:59:26 -0400
commitf04c6ce2cfaff4b982a6c8ad37e07c14379c111c (patch)
treef942286f4d8af718236b73f91cc053e92c424266
parentebc887b278944fc478ab31a4be8ba0cae5fe4f48 (diff)
userns: Convert devpts to use kuid/kgid where appropriate
Acked-by: Serge Hallyn <serge.hallyn@canonical.com> Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
-rw-r--r--fs/devpts/inode.c24
-rw-r--r--init/Kconfig1
2 files changed, 16 insertions, 9 deletions
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c
index 10f5e0b484d..979c1e309c7 100644
--- a/fs/devpts/inode.c
+++ b/fs/devpts/inode.c
@@ -98,8 +98,8 @@ static struct vfsmount *devpts_mnt;
98struct pts_mount_opts { 98struct pts_mount_opts {
99 int setuid; 99 int setuid;
100 int setgid; 100 int setgid;
101 uid_t uid; 101 kuid_t uid;
102 gid_t gid; 102 kgid_t gid;
103 umode_t mode; 103 umode_t mode;
104 umode_t ptmxmode; 104 umode_t ptmxmode;
105 int newinstance; 105 int newinstance;
@@ -158,11 +158,13 @@ static inline struct super_block *pts_sb_from_inode(struct inode *inode)
158static int parse_mount_options(char *data, int op, struct pts_mount_opts *opts) 158static int parse_mount_options(char *data, int op, struct pts_mount_opts *opts)
159{ 159{
160 char *p; 160 char *p;
161 kuid_t uid;
162 kgid_t gid;
161 163
162 opts->setuid = 0; 164 opts->setuid = 0;
163 opts->setgid = 0; 165 opts->setgid = 0;
164 opts->uid = 0; 166 opts->uid = GLOBAL_ROOT_UID;
165 opts->gid = 0; 167 opts->gid = GLOBAL_ROOT_GID;
166 opts->mode = DEVPTS_DEFAULT_MODE; 168 opts->mode = DEVPTS_DEFAULT_MODE;
167 opts->ptmxmode = DEVPTS_DEFAULT_PTMX_MODE; 169 opts->ptmxmode = DEVPTS_DEFAULT_PTMX_MODE;
168 opts->max = NR_UNIX98_PTY_MAX; 170 opts->max = NR_UNIX98_PTY_MAX;
@@ -184,13 +186,19 @@ static int parse_mount_options(char *data, int op, struct pts_mount_opts *opts)
184 case Opt_uid: 186 case Opt_uid:
185 if (match_int(&args[0], &option)) 187 if (match_int(&args[0], &option))
186 return -EINVAL; 188 return -EINVAL;
187 opts->uid = option; 189 uid = make_kuid(current_user_ns(), option);
190 if (!uid_valid(uid))
191 return -EINVAL;
192 opts->uid = uid;
188 opts->setuid = 1; 193 opts->setuid = 1;
189 break; 194 break;
190 case Opt_gid: 195 case Opt_gid:
191 if (match_int(&args[0], &option)) 196 if (match_int(&args[0], &option))
192 return -EINVAL; 197 return -EINVAL;
193 opts->gid = option; 198 gid = make_kgid(current_user_ns(), option);
199 if (!gid_valid(gid))
200 return -EINVAL;
201 opts->gid = gid;
194 opts->setgid = 1; 202 opts->setgid = 1;
195 break; 203 break;
196 case Opt_mode: 204 case Opt_mode:
@@ -315,9 +323,9 @@ static int devpts_show_options(struct seq_file *seq, struct dentry *root)
315 struct pts_mount_opts *opts = &fsi->mount_opts; 323 struct pts_mount_opts *opts = &fsi->mount_opts;
316 324
317 if (opts->setuid) 325 if (opts->setuid)
318 seq_printf(seq, ",uid=%u", opts->uid); 326 seq_printf(seq, ",uid=%u", from_kuid_munged(&init_user_ns, opts->uid));
319 if (opts->setgid) 327 if (opts->setgid)
320 seq_printf(seq, ",gid=%u", opts->gid); 328 seq_printf(seq, ",gid=%u", from_kgid_munged(&init_user_ns, opts->gid));
321 seq_printf(seq, ",mode=%03o", opts->mode); 329 seq_printf(seq, ",mode=%03o", opts->mode);
322#ifdef CONFIG_DEVPTS_MULTIPLE_INSTANCES 330#ifdef CONFIG_DEVPTS_MULTIPLE_INSTANCES
323 seq_printf(seq, ",ptmxmode=%03o", opts->ptmxmode); 331 seq_printf(seq, ",ptmxmode=%03o", opts->ptmxmode);
diff --git a/init/Kconfig b/init/Kconfig
index 994a53ec1d8..2738a7c4793 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -865,7 +865,6 @@ config UIDGID_CONVERTED
865 865
866 # List of kernel pieces that need user namespace work 866 # List of kernel pieces that need user namespace work
867 # Features 867 # Features
868 depends on UNIX98_PTYS = n
869 depends on CGROUPS = n 868 depends on CGROUPS = n
870 depends on MIGRATION = n 869 depends on MIGRATION = n
871 depends on NUMA = n 870 depends on NUMA = n