]> Pileus Git - ~andy/linux/blobdiff - fs/9p/v9fs.c
Merge branch 'v3.9-samsung-fixes-1' of git://git.kernel.org/pub/scm/linux/kernel...
[~andy/linux] / fs / 9p / v9fs.c
index d934f04e77368e00dc76d4a54720cff0758d3a58..58e6cbce4156fb37a9820297e3a35c83d3524e81 100644 (file)
@@ -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)) {
@@ -375,7 +395,7 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
                v9ses->flags &= ~V9FS_ACL_MASK;
        }
 
-       fid = p9_client_attach(v9ses->clnt, NULL, v9ses->uname, ~0,
+       fid = p9_client_attach(v9ses->clnt, NULL, v9ses->uname, INVALID_UID,
                                                        v9ses->aname);
        if (IS_ERR(fid)) {
                retval = PTR_ERR(fid);
@@ -387,7 +407,7 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,
        if ((v9ses->flags & V9FS_ACCESS_MASK) == V9FS_ACCESS_SINGLE)
                fid->uid = v9ses->uid;
        else
-               fid->uid = ~0;
+               fid->uid = INVALID_UID;
 
 #ifdef CONFIG_9P_FSCACHE
        /* register the session for caching */