diff options
Diffstat (limited to 'net/sunrpc/svcauth_unix.c')
| -rw-r--r-- | net/sunrpc/svcauth_unix.c | 16 | 
1 files changed, 10 insertions, 6 deletions
diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c index fb9041b92f72..5c04ba7d456b 100644 --- a/net/sunrpc/svcauth_unix.c +++ b/net/sunrpc/svcauth_unix.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0-only  #include <linux/types.h>  #include <linux/sched.h>  #include <linux/module.h> @@ -500,7 +501,7 @@ static int unix_gid_parse(struct cache_detail *cd,  	rv = get_int(&mesg, &id);  	if (rv)  		return -EINVAL; -	uid = make_kuid(&init_user_ns, id); +	uid = make_kuid(current_user_ns(), id);  	ug.uid = uid;  	expiry = get_expiry(&mesg); @@ -522,7 +523,7 @@ static int unix_gid_parse(struct cache_detail *cd,  		err = -EINVAL;  		if (rv)  			goto out; -		kgid = make_kgid(&init_user_ns, gid); +		kgid = make_kgid(current_user_ns(), gid);  		if (!gid_valid(kgid))  			goto out;  		ug.gi->gid[i] = kgid; @@ -555,7 +556,7 @@ static int unix_gid_show(struct seq_file *m,  			 struct cache_detail *cd,  			 struct cache_head *h)  { -	struct user_namespace *user_ns = &init_user_ns; +	struct user_namespace *user_ns = m->file->f_cred->user_ns;  	struct unix_gid *ug;  	int i;  	int glen; @@ -796,6 +797,7 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)  	struct kvec	*argv = &rqstp->rq_arg.head[0];  	struct kvec	*resv = &rqstp->rq_res.head[0];  	struct svc_cred	*cred = &rqstp->rq_cred; +	struct user_namespace *userns;  	u32		slen, i;  	int		len   = argv->iov_len; @@ -816,8 +818,10 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)  	 * (export-specific) anonymous id by nfsd_setuser.  	 * Supplementary gid's will be left alone.  	 */ -	cred->cr_uid = make_kuid(&init_user_ns, svc_getnl(argv)); /* uid */ -	cred->cr_gid = make_kgid(&init_user_ns, svc_getnl(argv)); /* gid */ +	userns = (rqstp->rq_xprt && rqstp->rq_xprt->xpt_cred) ? +		rqstp->rq_xprt->xpt_cred->user_ns : &init_user_ns; +	cred->cr_uid = make_kuid(userns, svc_getnl(argv)); /* uid */ +	cred->cr_gid = make_kgid(userns, svc_getnl(argv)); /* gid */  	slen = svc_getnl(argv);			/* gids length */  	if (slen > UNX_NGROUPS || (len -= (slen + 2)*4) < 0)  		goto badcred; @@ -825,7 +829,7 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)  	if (cred->cr_group_info == NULL)  		return SVC_CLOSE;  	for (i = 0; i < slen; i++) { -		kgid_t kgid = make_kgid(&init_user_ns, svc_getnl(argv)); +		kgid_t kgid = make_kgid(userns, svc_getnl(argv));  		cred->cr_group_info->gid[i] = kgid;  	}  	groups_sort(cred->cr_group_info);  |