diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2012-02-07 19:22:56 -0500 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2012-05-15 17:59:26 -0400 |
commit | f04c6ce2cfaff4b982a6c8ad37e07c14379c111c (patch) | |
tree | f942286f4d8af718236b73f91cc053e92c424266 /fs | |
parent | ebc887b278944fc478ab31a4be8ba0cae5fe4f48 (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>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/devpts/inode.c | 24 |
1 files changed, 16 insertions, 8 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; | |||
98 | struct pts_mount_opts { | 98 | struct 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) | |||
158 | static int parse_mount_options(char *data, int op, struct pts_mount_opts *opts) | 158 | static 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); |