diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-25 16:00:49 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-25 16:00:49 -0800 | 
| commit | 94f2f14234178f118545a0be60a6371ddeb229b7 (patch) | |
| tree | 313af6e9e255e9060fc24c836cd71ce712502b17 /fs/nfsd/nfs4xdr.c | |
| parent | 8d168f71551ec2a6528d01d0389b7a73c091e3e7 (diff) | |
| parent | 139321c65c0584cd65c4c87a5eb3fdb4fdbd0e19 (diff) | |
| download | olio-linux-3.10-94f2f14234178f118545a0be60a6371ddeb229b7.tar.xz olio-linux-3.10-94f2f14234178f118545a0be60a6371ddeb229b7.zip  | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
Pull user namespace and namespace infrastructure changes from Eric W Biederman:
 "This set of changes starts with a few small enhnacements to the user
  namespace.  reboot support, allowing more arbitrary mappings, and
  support for mounting devpts, ramfs, tmpfs, and mqueuefs as just the
  user namespace root.
  I do my best to document that if you care about limiting your
  unprivileged users that when you have the user namespace support
  enabled you will need to enable memory control groups.
  There is a minor bug fix to prevent overflowing the stack if someone
  creates way too many user namespaces.
  The bulk of the changes are a continuation of the kuid/kgid push down
  work through the filesystems.  These changes make using uids and gids
  typesafe which ensures that these filesystems are safe to use when
  multiple user namespaces are in use.  The filesystems converted for
  3.9 are ceph, 9p, afs, ocfs2, gfs2, ncpfs, nfs, nfsd, and cifs.  The
  changes for these filesystems were a little more involved so I split
  the changes into smaller hopefully obviously correct changes.
  XFS is the only filesystem that remains.  I was hoping I could get
  that in this release so that user namespace support would be enabled
  with an allyesconfig or an allmodconfig but it looks like the xfs
  changes need another couple of days before it they are ready."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace: (93 commits)
  cifs: Enable building with user namespaces enabled.
  cifs: Convert struct cifs_ses to use a kuid_t and a kgid_t
  cifs: Convert struct cifs_sb_info to use kuids and kgids
  cifs: Modify struct smb_vol to use kuids and kgids
  cifs: Convert struct cifsFileInfo to use a kuid
  cifs: Convert struct cifs_fattr to use kuid and kgids
  cifs: Convert struct tcon_link to use a kuid.
  cifs: Modify struct cifs_unix_set_info_args to hold a kuid_t and a kgid_t
  cifs: Convert from a kuid before printing current_fsuid
  cifs: Use kuids and kgids SID to uid/gid mapping
  cifs: Pass GLOBAL_ROOT_UID and GLOBAL_ROOT_GID to keyring_alloc
  cifs: Use BUILD_BUG_ON to validate uids and gids are the same size
  cifs: Override unmappable incoming uids and gids
  nfsd: Enable building with user namespaces enabled.
  nfsd: Properly compare and initialize kuids and kgids
  nfsd: Store ex_anon_uid and ex_anon_gid as kuids and kgids
  nfsd: Modify nfsd4_cb_sec to use kuids and kgids
  nfsd: Handle kuids and kgids in the nfs4acl to posix_acl conversion
  nfsd: Convert nfsxdr to use kuids and kgids
  nfsd: Convert nfs3xdr to use kuids and kgids
  ...
Diffstat (limited to 'fs/nfsd/nfs4xdr.c')
| -rw-r--r-- | fs/nfsd/nfs4xdr.c | 54 | 
1 files changed, 35 insertions, 19 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 0dc11586682..2d1d06bae3a 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -293,13 +293,13 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,  			ace->whotype = nfs4_acl_get_whotype(buf, dummy32);  			status = nfs_ok;  			if (ace->whotype != NFS4_ACL_WHO_NAMED) -				ace->who = 0; +				;  			else if (ace->flag & NFS4_ACE_IDENTIFIER_GROUP)  				status = nfsd_map_name_to_gid(argp->rqstp, -						buf, dummy32, &ace->who); +						buf, dummy32, &ace->who_gid);  			else  				status = nfsd_map_name_to_uid(argp->rqstp, -						buf, dummy32, &ace->who); +						buf, dummy32, &ace->who_uid);  			if (status)  				return status;  		} @@ -464,9 +464,16 @@ static __be32 nfsd4_decode_cb_sec(struct nfsd4_compoundargs *argp, struct nfsd4_  			READ32(dummy);  			READ_BUF(dummy * 4);  			if (cbs->flavor == (u32)(-1)) { -				cbs->uid = uid; -				cbs->gid = gid; -				cbs->flavor = RPC_AUTH_UNIX; +				kuid_t kuid = make_kuid(&init_user_ns, uid); +				kgid_t kgid = make_kgid(&init_user_ns, gid); +				if (uid_valid(kuid) && gid_valid(kgid)) { +					cbs->uid = kuid; +					cbs->gid = kgid; +					cbs->flavor = RPC_AUTH_UNIX; +				} else { +					dprintk("RPC_AUTH_UNIX with invalid" +						"uid or gid ignoring!\n"); +				}  			}  			break;  		case RPC_AUTH_GSS: @@ -1926,7 +1933,7 @@ static u32 nfs4_file_type(umode_t mode)  }  static __be32 -nfsd4_encode_name(struct svc_rqst *rqstp, int whotype, uid_t id, int group, +nfsd4_encode_name(struct svc_rqst *rqstp, int whotype, kuid_t uid, kgid_t gid,  			__be32 **p, int *buflen)  {  	int status; @@ -1935,10 +1942,10 @@ nfsd4_encode_name(struct svc_rqst *rqstp, int whotype, uid_t id, int group,  		return nfserr_resource;  	if (whotype != NFS4_ACL_WHO_NAMED)  		status = nfs4_acl_write_who(whotype, (u8 *)(*p + 1)); -	else if (group) -		status = nfsd_map_gid_to_name(rqstp, id, (u8 *)(*p + 1)); +	else if (gid_valid(gid)) +		status = nfsd_map_gid_to_name(rqstp, gid, (u8 *)(*p + 1));  	else -		status = nfsd_map_uid_to_name(rqstp, id, (u8 *)(*p + 1)); +		status = nfsd_map_uid_to_name(rqstp, uid, (u8 *)(*p + 1));  	if (status < 0)  		return nfserrno(status);  	*p = xdr_encode_opaque(*p, NULL, status); @@ -1948,22 +1955,33 @@ nfsd4_encode_name(struct svc_rqst *rqstp, int whotype, uid_t id, int group,  }  static inline __be32 -nfsd4_encode_user(struct svc_rqst *rqstp, uid_t uid, __be32 **p, int *buflen) +nfsd4_encode_user(struct svc_rqst *rqstp, kuid_t user, __be32 **p, int *buflen)  { -	return nfsd4_encode_name(rqstp, NFS4_ACL_WHO_NAMED, uid, 0, p, buflen); +	return nfsd4_encode_name(rqstp, NFS4_ACL_WHO_NAMED, user, INVALID_GID, +				 p, buflen);  }  static inline __be32 -nfsd4_encode_group(struct svc_rqst *rqstp, uid_t gid, __be32 **p, int *buflen) +nfsd4_encode_group(struct svc_rqst *rqstp, kgid_t group, __be32 **p, int *buflen)  { -	return nfsd4_encode_name(rqstp, NFS4_ACL_WHO_NAMED, gid, 1, p, buflen); +	return nfsd4_encode_name(rqstp, NFS4_ACL_WHO_NAMED, INVALID_UID, group, +				 p, buflen);  }  static inline __be32 -nfsd4_encode_aclname(struct svc_rqst *rqstp, int whotype, uid_t id, int group, +nfsd4_encode_aclname(struct svc_rqst *rqstp, struct nfs4_ace *ace,  		__be32 **p, int *buflen)  { -	return nfsd4_encode_name(rqstp, whotype, id, group, p, buflen); +	kuid_t uid = INVALID_UID; +	kgid_t gid = INVALID_GID; + +	if (ace->whotype == NFS4_ACL_WHO_NAMED) { +		if (ace->flag & NFS4_ACE_IDENTIFIER_GROUP) +			gid = ace->who_gid; +		else +			uid = ace->who_uid; +	} +	return nfsd4_encode_name(rqstp, ace->whotype, uid, gid, p, buflen);  }  #define WORD0_ABSENT_FS_ATTRS (FATTR4_WORD0_FS_LOCATIONS | FATTR4_WORD0_FSID | \ @@ -2224,9 +2242,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,  			WRITE32(ace->type);  			WRITE32(ace->flag);  			WRITE32(ace->access_mask & NFS4_ACE_MASK_ALL); -			status = nfsd4_encode_aclname(rqstp, ace->whotype, -				ace->who, ace->flag & NFS4_ACE_IDENTIFIER_GROUP, -				&p, &buflen); +			status = nfsd4_encode_aclname(rqstp, ace, &p, &buflen);  			if (status == nfserr_resource)  				goto out_resource;  			if (status)  |