|
@@ -220,8 +220,8 @@ struct ffs_data {
|
|
|
/* File permissions, written once when fs is mounted */
|
|
|
struct ffs_file_perms {
|
|
|
umode_t mode;
|
|
|
- uid_t uid;
|
|
|
- gid_t gid;
|
|
|
+ kuid_t uid;
|
|
|
+ kgid_t gid;
|
|
|
} file_perms;
|
|
|
|
|
|
/*
|
|
@@ -1143,10 +1143,19 @@ static int ffs_fs_parse_opts(struct ffs_sb_fill_data *data, char *opts)
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
- if (!memcmp(opts, "uid", 3))
|
|
|
- data->perms.uid = value;
|
|
|
+ if (!memcmp(opts, "uid", 3)) {
|
|
|
+ data->perms.uid = make_kuid(current_user_ns(), value);
|
|
|
+ if (!uid_valid(data->perms.uid)) {
|
|
|
+ pr_err("%s: unmapped value: %lu\n", opts, value);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ }
|
|
|
else if (!memcmp(opts, "gid", 3))
|
|
|
- data->perms.gid = value;
|
|
|
+ data->perms.gid = make_kgid(current_user_ns(), value);
|
|
|
+ if (!gid_valid(data->perms.gid)) {
|
|
|
+ pr_err("%s: unmapped value: %lu\n", opts, value);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
else
|
|
|
goto invalid;
|
|
|
break;
|
|
@@ -1175,8 +1184,8 @@ ffs_fs_mount(struct file_system_type *t, int flags,
|
|
|
struct ffs_sb_fill_data data = {
|
|
|
.perms = {
|
|
|
.mode = S_IFREG | 0600,
|
|
|
- .uid = 0,
|
|
|
- .gid = 0
|
|
|
+ .uid = GLOBAL_ROOT_UID,
|
|
|
+ .gid = GLOBAL_ROOT_GID,
|
|
|
},
|
|
|
.root_mode = S_IFDIR | 0500,
|
|
|
};
|