|
@@ -161,7 +161,13 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
|
|
|
ret = r;
|
|
|
continue;
|
|
|
}
|
|
|
- v9ses->dfltuid = option;
|
|
|
+ v9ses->dfltuid = make_kuid(current_user_ns(), option);
|
|
|
+ if (!uid_valid(v9ses->dfltuid)) {
|
|
|
+ p9_debug(P9_DEBUG_ERROR,
|
|
|
+ "uid field, but not a uid?\n");
|
|
|
+ ret = -EINVAL;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
break;
|
|
|
case Opt_dfltgid:
|
|
|
r = match_int(&args[0], &option);
|
|
@@ -171,7 +177,13 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
|
|
|
ret = r;
|
|
|
continue;
|
|
|
}
|
|
|
- v9ses->dfltgid = option;
|
|
|
+ v9ses->dfltgid = make_kgid(current_user_ns(), option);
|
|
|
+ if (!gid_valid(v9ses->dfltgid)) {
|
|
|
+ p9_debug(P9_DEBUG_ERROR,
|
|
|
+ "gid field, but not a gid?\n");
|
|
|
+ ret = -EINVAL;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
break;
|
|
|
case Opt_afid:
|
|
|
r = match_int(&args[0], &option);
|
|
@@ -248,8 +260,9 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
|
|
|
else if (strcmp(s, "client") == 0) {
|
|
|
v9ses->flags |= V9FS_ACCESS_CLIENT;
|
|
|
} else {
|
|
|
+ uid_t uid;
|
|
|
v9ses->flags |= V9FS_ACCESS_SINGLE;
|
|
|
- v9ses->uid = simple_strtoul(s, &e, 10);
|
|
|
+ uid = simple_strtoul(s, &e, 10);
|
|
|
if (*e != '\0') {
|
|
|
ret = -EINVAL;
|
|
|
pr_info("Unknown access argument %s\n",
|
|
@@ -257,6 +270,13 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)
|
|
|
kfree(s);
|
|
|
goto free_and_return;
|
|
|
}
|
|
|
+ v9ses->uid = make_kuid(current_user_ns(), uid);
|
|
|
+ if (!uid_valid(v9ses->uid)) {
|
|
|
+ ret = -EINVAL;
|
|
|
+ pr_info("Uknown uid %s\n", s);
|
|
|
+ kfree(s);
|
|
|
+ goto free_and_return;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
kfree(s);
|
|
@@ -319,7 +339,7 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
|
|
|
list_add(&v9ses->slist, &v9fs_sessionlist);
|
|
|
spin_unlock(&v9fs_sessionlist_lock);
|
|
|
|
|
|
- v9ses->uid = ~0;
|
|
|
+ v9ses->uid = INVALID_UID;
|
|
|
v9ses->dfltuid = V9FS_DEFUID;
|
|
|
v9ses->dfltgid = V9FS_DEFGID;
|
|
|
|
|
@@ -364,7 +384,7 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
|
|
|
|
|
|
v9ses->flags &= ~V9FS_ACCESS_MASK;
|
|
|
v9ses->flags |= V9FS_ACCESS_ANY;
|
|
|
- v9ses->uid = ~0;
|
|
|
+ v9ses->uid = INVALID_UID;
|
|
|
}
|
|
|
if (!v9fs_proto_dotl(v9ses) ||
|
|
|
!((v9ses->flags & V9FS_ACCESS_MASK) == V9FS_ACCESS_CLIENT)) {
|