diff options
Diffstat (limited to 'net/sunrpc/auth_unix.c')
| -rw-r--r-- | net/sunrpc/auth_unix.c | 30 | 
1 files changed, 17 insertions, 13 deletions
diff --git a/net/sunrpc/auth_unix.c b/net/sunrpc/auth_unix.c index 4cb70dc6e7a..d5d69236629 100644 --- a/net/sunrpc/auth_unix.c +++ b/net/sunrpc/auth_unix.c @@ -12,13 +12,14 @@  #include <linux/module.h>  #include <linux/sunrpc/clnt.h>  #include <linux/sunrpc/auth.h> +#include <linux/user_namespace.h>  #define NFS_NGROUPS	16  struct unx_cred {  	struct rpc_cred		uc_base; -	gid_t			uc_gid; -	gid_t			uc_gids[NFS_NGROUPS]; +	kgid_t			uc_gid; +	kgid_t			uc_gids[NFS_NGROUPS];  };  #define uc_uid			uc_base.cr_uid @@ -32,7 +33,7 @@ static struct rpc_auth		unix_auth;  static const struct rpc_credops	unix_credops;  static struct rpc_auth * -unx_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor) +unx_create(struct rpc_auth_create_args *args, struct rpc_clnt *clnt)  {  	dprintk("RPC:       creating UNIX authenticator for client %p\n",  			clnt); @@ -64,7 +65,8 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)  	unsigned int i;  	dprintk("RPC:       allocating UNIX cred for uid %d gid %d\n", -			acred->uid, acred->gid); +			from_kuid(&init_user_ns, acred->uid), +			from_kgid(&init_user_ns, acred->gid));  	if (!(cred = kmalloc(sizeof(*cred), GFP_NOFS)))  		return ERR_PTR(-ENOMEM); @@ -81,7 +83,7 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)  	for (i = 0; i < groups; i++)  		cred->uc_gids[i] = GROUP_AT(acred->group_info, i);  	if (i < NFS_NGROUPS) -		cred->uc_gids[i] = NOGROUP; +		cred->uc_gids[i] = INVALID_GID;  	return &cred->uc_base;  } @@ -119,7 +121,7 @@ unx_match(struct auth_cred *acred, struct rpc_cred *rcred, int flags)  	unsigned int i; -	if (cred->uc_uid != acred->uid || cred->uc_gid != acred->gid) +	if (!uid_eq(cred->uc_uid, acred->uid) || !gid_eq(cred->uc_gid, acred->gid))  		return 0;  	if (acred->group_info != NULL) @@ -127,8 +129,10 @@ unx_match(struct auth_cred *acred, struct rpc_cred *rcred, int flags)  	if (groups > NFS_NGROUPS)  		groups = NFS_NGROUPS;  	for (i = 0; i < groups ; i++) -		if (cred->uc_gids[i] != GROUP_AT(acred->group_info, i)) +		if (!gid_eq(cred->uc_gids[i], GROUP_AT(acred->group_info, i)))  			return 0; +	if (groups < NFS_NGROUPS && gid_valid(cred->uc_gids[groups])) +		return 0;  	return 1;  } @@ -153,11 +157,11 @@ unx_marshal(struct rpc_task *task, __be32 *p)  	 */  	p = xdr_encode_array(p, clnt->cl_nodename, clnt->cl_nodelen); -	*p++ = htonl((u32) cred->uc_uid); -	*p++ = htonl((u32) cred->uc_gid); +	*p++ = htonl((u32) from_kuid(&init_user_ns, cred->uc_uid)); +	*p++ = htonl((u32) from_kgid(&init_user_ns, cred->uc_gid));  	hold = p++; -	for (i = 0; i < 16 && cred->uc_gids[i] != (gid_t) NOGROUP; i++) -		*p++ = htonl((u32) cred->uc_gids[i]); +	for (i = 0; i < 16 && gid_valid(cred->uc_gids[i]); i++) +		*p++ = htonl((u32) from_kgid(&init_user_ns, cred->uc_gids[i]));  	*hold = htonl(p - hold - 1);		/* gid array length */  	*base = htonl((p - base - 1) << 2);	/* cred length */ @@ -188,13 +192,13 @@ unx_validate(struct rpc_task *task, __be32 *p)  	    flavor != RPC_AUTH_UNIX &&  	    flavor != RPC_AUTH_SHORT) {  		printk("RPC: bad verf flavor: %u\n", flavor); -		return NULL; +		return ERR_PTR(-EIO);  	}  	size = ntohl(*p++);  	if (size > RPC_MAX_AUTH_SIZE) {  		printk("RPC: giant verf size: %u\n", size); -		return NULL; +		return ERR_PTR(-EIO);  	}  	task->tk_rqstp->rq_cred->cr_auth->au_rslack = (size >> 2) + 2;  	p += (size >> 2);  | 
