Merge branch 'for-3.5' of git://linux-nfs.org/~bfields/linux
[pandora-kernel.git] / net / sunrpc / svcauth_unix.c
index 88962cf..2777fa8 100644 (file)
@@ -14,6 +14,7 @@
 #include <net/sock.h>
 #include <net/ipv6.h>
 #include <linux/kernel.h>
+#include <linux/user_namespace.h>
 #define RPCDBG_FACILITY        RPCDBG_AUTH
 
 #include <linux/sunrpc/clnt.h>
@@ -525,11 +526,15 @@ static int unix_gid_parse(struct cache_detail *cd,
 
        for (i = 0 ; i < gids ; i++) {
                int gid;
+               kgid_t kgid;
                rv = get_int(&mesg, &gid);
                err = -EINVAL;
                if (rv)
                        goto out;
-               GROUP_AT(ug.gi, i) = gid;
+               kgid = make_kgid(&init_user_ns, gid);
+               if (!gid_valid(kgid))
+                       goto out;
+               GROUP_AT(ug.gi, i) = kgid;
        }
 
        ugp = unix_gid_lookup(cd, uid);
@@ -558,6 +563,7 @@ static int unix_gid_show(struct seq_file *m,
                         struct cache_detail *cd,
                         struct cache_head *h)
 {
+       struct user_namespace *user_ns = current_user_ns();
        struct unix_gid *ug;
        int i;
        int glen;
@@ -575,7 +581,7 @@ static int unix_gid_show(struct seq_file *m,
 
        seq_printf(m, "%u %d:", ug->uid, glen);
        for (i = 0; i < glen; i++)
-               seq_printf(m, " %d", GROUP_AT(ug->gi, i));
+               seq_printf(m, " %d", from_kgid_munged(user_ns, GROUP_AT(ug->gi, i)));
        seq_printf(m, "\n");
        return 0;
 }
@@ -828,8 +834,12 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)
        cred->cr_group_info = groups_alloc(slen);
        if (cred->cr_group_info == NULL)
                return SVC_CLOSE;
-       for (i = 0; i < slen; i++)
-               GROUP_AT(cred->cr_group_info, i) = svc_getnl(argv);
+       for (i = 0; i < slen; i++) {
+               kgid_t kgid = make_kgid(&init_user_ns, svc_getnl(argv));
+               if (!gid_valid(kgid))
+                       goto badcred;
+               GROUP_AT(cred->cr_group_info, i) = kgid;
+       }
        if (svc_getu32(argv) != htonl(RPC_AUTH_NULL) || svc_getu32(argv) != 0) {
                *authp = rpc_autherr_badverf;
                return SVC_DENIED;