diff options
Diffstat (limited to 'fs/debugfs')
| -rw-r--r-- | fs/debugfs/inode.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index 6393fd61d5c4..b607d92cdf24 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c | |||
| @@ -128,8 +128,8 @@ static inline int debugfs_positive(struct dentry *dentry) | |||
| 128 | } | 128 | } |
| 129 | 129 | ||
| 130 | struct debugfs_mount_opts { | 130 | struct debugfs_mount_opts { |
| 131 | uid_t uid; | 131 | kuid_t uid; |
| 132 | gid_t gid; | 132 | kgid_t gid; |
| 133 | umode_t mode; | 133 | umode_t mode; |
| 134 | }; | 134 | }; |
| 135 | 135 | ||
| @@ -156,6 +156,8 @@ static int debugfs_parse_options(char *data, struct debugfs_mount_opts *opts) | |||
| 156 | substring_t args[MAX_OPT_ARGS]; | 156 | substring_t args[MAX_OPT_ARGS]; |
| 157 | int option; | 157 | int option; |
| 158 | int token; | 158 | int token; |
| 159 | kuid_t uid; | ||
| 160 | kgid_t gid; | ||
| 159 | char *p; | 161 | char *p; |
| 160 | 162 | ||
| 161 | opts->mode = DEBUGFS_DEFAULT_MODE; | 163 | opts->mode = DEBUGFS_DEFAULT_MODE; |
| @@ -169,12 +171,18 @@ static int debugfs_parse_options(char *data, struct debugfs_mount_opts *opts) | |||
| 169 | case Opt_uid: | 171 | case Opt_uid: |
| 170 | if (match_int(&args[0], &option)) | 172 | if (match_int(&args[0], &option)) |
| 171 | return -EINVAL; | 173 | return -EINVAL; |
| 172 | opts->uid = option; | 174 | uid = make_kuid(current_user_ns(), option); |
| 175 | if (!uid_valid(uid)) | ||
| 176 | return -EINVAL; | ||
| 177 | opts->uid = uid; | ||
| 173 | break; | 178 | break; |
| 174 | case Opt_gid: | 179 | case Opt_gid: |
| 175 | if (match_octal(&args[0], &option)) | 180 | if (match_octal(&args[0], &option)) |
| 176 | return -EINVAL; | 181 | return -EINVAL; |
| 177 | opts->gid = option; | 182 | gid = make_kgid(current_user_ns(), option); |
| 183 | if (!gid_valid(gid)) | ||
| 184 | return -EINVAL; | ||
| 185 | opts->gid = gid; | ||
| 178 | break; | 186 | break; |
| 179 | case Opt_mode: | 187 | case Opt_mode: |
| 180 | if (match_octal(&args[0], &option)) | 188 | if (match_octal(&args[0], &option)) |
| @@ -226,10 +234,12 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root) | |||
| 226 | struct debugfs_fs_info *fsi = root->d_sb->s_fs_info; | 234 | struct debugfs_fs_info *fsi = root->d_sb->s_fs_info; |
| 227 | struct debugfs_mount_opts *opts = &fsi->mount_opts; | 235 | struct debugfs_mount_opts *opts = &fsi->mount_opts; |
| 228 | 236 | ||
| 229 | if (opts->uid != 0) | 237 | if (!uid_eq(opts->uid, GLOBAL_ROOT_UID)) |
| 230 | seq_printf(m, ",uid=%u", opts->uid); | 238 | seq_printf(m, ",uid=%u", |
| 231 | if (opts->gid != 0) | 239 | from_kuid_munged(&init_user_ns, opts->uid)); |
| 232 | seq_printf(m, ",gid=%u", opts->gid); | 240 | if (!gid_eq(opts->gid, GLOBAL_ROOT_GID)) |
| 241 | seq_printf(m, ",gid=%u", | ||
| 242 | from_kgid_munged(&init_user_ns, opts->gid)); | ||
| 233 | if (opts->mode != DEBUGFS_DEFAULT_MODE) | 243 | if (opts->mode != DEBUGFS_DEFAULT_MODE) |
| 234 | seq_printf(m, ",mode=%o", opts->mode); | 244 | seq_printf(m, ",mode=%o", opts->mode); |
| 235 | 245 | ||
