sunrpc: Properly decode kuids and kgids in RPC_AUTH_UNIX credentials
authorEric W. Biederman <ebiederm@xmission.com>
Sat, 2 Feb 2013 11:03:04 +0000 (03:03 -0800)
committerEric W. Biederman <ebiederm@xmission.com>
Wed, 13 Feb 2013 14:15:26 +0000 (06:15 -0800)
When reading kuids from the wire map them into the initial user
namespace, and validate the mapping succeded.

When reading kgids from the wire map them into the initial user
namespace, and validate the mapping succeded.

Cc: "J. Bruce Fields" <bfields@fieldses.org>
Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
net/sunrpc/svcauth_unix.c

index bdea0a1b6d1dd3fa7c2227a7f569a8bc3e9063b9..a1852e19ed0ced5297189dc5b5171217cc4c33e9 100644 (file)
@@ -821,8 +821,10 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)
        argv->iov_base = (void*)((__be32*)argv->iov_base + slen);       /* skip machname */
        argv->iov_len -= slen*4;
 
-       cred->cr_uid = svc_getnl(argv);         /* uid */
-       cred->cr_gid = svc_getnl(argv);         /* gid */
+       cred->cr_uid = make_kuid(&init_user_ns, svc_getnl(argv)); /* uid */
+       cred->cr_gid = make_kgid(&init_user_ns, svc_getnl(argv)); /* gid */
+       if (!uid_valid(cred->cr_uid) || !gid_valid(cred->cr_gid))
+               goto badcred;
        slen = svc_getnl(argv);                 /* gids length */
        if (slen > 16 || (len -= (slen + 2)*4) < 0)
                goto badcred;