svcrpc: fix gss-proxy to respect user namespaces
authorJ. Bruce Fields <bfields@redhat.com>
Mon, 29 Apr 2013 22:21:29 +0000 (18:21 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Mon, 29 Apr 2013 22:21:29 +0000 (18:21 -0400)
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
net/sunrpc/auth_gss/gss_rpc_xdr.c

index d0ccdff..5c4c61d 100644 (file)
@@ -216,13 +216,13 @@ static int gssx_dec_linux_creds(struct xdr_stream *xdr,
        err = get_s32(&q, end, &tmp);
        if (err)
                return err;
-       creds->cr_uid = tmp;
+       creds->cr_uid = make_kuid(&init_user_ns, tmp);
 
        /* gid */
        err = get_s32(&q, end, &tmp);
        if (err)
                return err;
-       creds->cr_gid = tmp;
+       creds->cr_gid = make_kgid(&init_user_ns, tmp);
 
        /* number of additional gid's */
        err = get_s32(&q, end, &tmp);
@@ -235,15 +235,21 @@ static int gssx_dec_linux_creds(struct xdr_stream *xdr,
 
        /* gid's */
        for (i = 0; i < N; i++) {
+               kgid_t kgid;
                err = get_s32(&q, end, &tmp);
-               if (err) {
-                       groups_free(creds->cr_group_info);
-                       return err;
-               }
-               GROUP_AT(creds->cr_group_info, i) = tmp;
+               if (err)
+                       goto out_free_groups;
+               err = -EINVAL;
+               kgid = make_kgid(&init_user_ns, tmp);
+               if (!gid_valid(kgid))
+                       goto out_free_groups;
+               GROUP_AT(creds->cr_group_info, i) = kgid;
        }
 
        return 0;
+out_free_groups:
+       groups_free(creds->cr_group_info);
+       return err;
 }
 
 static int gssx_dec_option_array(struct xdr_stream *xdr,