diff options
Diffstat (limited to 'fs/nfsd/nfs4idmap.c')
| -rw-r--r-- | fs/nfsd/nfs4idmap.c | 38 | 
1 files changed, 26 insertions, 12 deletions
diff --git a/fs/nfsd/nfs4idmap.c b/fs/nfsd/nfs4idmap.c index a1f10c0a625..0ce12346df9 100644 --- a/fs/nfsd/nfs4idmap.c +++ b/fs/nfsd/nfs4idmap.c @@ -65,7 +65,7 @@ MODULE_PARM_DESC(nfs4_disable_idmapping,  struct ent {  	struct cache_head h;  	int               type;		       /* User / Group */ -	uid_t             id; +	u32               id;  	char              name[IDMAP_NAMESZ];  	char              authname[IDMAP_NAMESZ];  }; @@ -540,7 +540,7 @@ rqst_authname(struct svc_rqst *rqstp)  static __be32  idmap_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen, -		uid_t *id) +		u32 *id)  {  	struct ent *item, key = {  		.type = type, @@ -564,7 +564,7 @@ idmap_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen  }  static int -idmap_id_to_name(struct svc_rqst *rqstp, int type, uid_t id, char *name) +idmap_id_to_name(struct svc_rqst *rqstp, int type, u32 id, char *name)  {  	struct ent *item, key = {  		.id = id, @@ -587,7 +587,7 @@ idmap_id_to_name(struct svc_rqst *rqstp, int type, uid_t id, char *name)  }  static bool -numeric_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen, uid_t *id) +numeric_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen, u32 *id)  {  	int ret;  	char buf[11]; @@ -603,7 +603,7 @@ numeric_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namel  }  static __be32 -do_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen, uid_t *id) +do_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen, u32 *id)  {  	if (nfs4_disable_idmapping && rqstp->rq_cred.cr_flavor < RPC_AUTH_GSS)  		if (numeric_name_to_id(rqstp, type, name, namelen, id)) @@ -616,7 +616,7 @@ do_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen, u  }  static int -do_id_to_name(struct svc_rqst *rqstp, int type, uid_t id, char *name) +do_id_to_name(struct svc_rqst *rqstp, int type, u32 id, char *name)  {  	if (nfs4_disable_idmapping && rqstp->rq_cred.cr_flavor < RPC_AUTH_GSS)  		return sprintf(name, "%u", id); @@ -625,26 +625,40 @@ do_id_to_name(struct svc_rqst *rqstp, int type, uid_t id, char *name)  __be32  nfsd_map_name_to_uid(struct svc_rqst *rqstp, const char *name, size_t namelen, -		__u32 *id) +		kuid_t *uid)  { -	return do_name_to_id(rqstp, IDMAP_TYPE_USER, name, namelen, id); +	__be32 status; +	u32 id = -1; +	status = do_name_to_id(rqstp, IDMAP_TYPE_USER, name, namelen, &id); +	*uid = make_kuid(&init_user_ns, id); +	if (!uid_valid(*uid)) +		status = nfserr_badowner; +	return status;  }  __be32  nfsd_map_name_to_gid(struct svc_rqst *rqstp, const char *name, size_t namelen, -		__u32 *id) +		kgid_t *gid)  { -	return do_name_to_id(rqstp, IDMAP_TYPE_GROUP, name, namelen, id); +	__be32 status; +	u32 id = -1; +	status = do_name_to_id(rqstp, IDMAP_TYPE_GROUP, name, namelen, &id); +	*gid = make_kgid(&init_user_ns, id); +	if (!gid_valid(*gid)) +		status = nfserr_badowner; +	return status;  }  int -nfsd_map_uid_to_name(struct svc_rqst *rqstp, __u32 id, char *name) +nfsd_map_uid_to_name(struct svc_rqst *rqstp, kuid_t uid, char *name)  { +	u32 id = from_kuid(&init_user_ns, uid);  	return do_id_to_name(rqstp, IDMAP_TYPE_USER, id, name);  }  int -nfsd_map_gid_to_name(struct svc_rqst *rqstp, __u32 id, char *name) +nfsd_map_gid_to_name(struct svc_rqst *rqstp, kgid_t gid, char *name)  { +	u32 id = from_kgid(&init_user_ns, gid);  	return do_id_to_name(rqstp, IDMAP_TYPE_GROUP, id, name);  }  |