mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	nfsd: Store ex_anon_uid and ex_anon_gid as kuids and kgids
Cc: "J. Bruce Fields" <bfields@fieldses.org> Cc: Trond Myklebust <Trond.Myklebust@netapp.com> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
This commit is contained in:
		
							parent
							
								
									03bc6d1cc1
								
							
						
					
					
						commit
						4c1e1b34d5
					
				
					 3 changed files with 17 additions and 11 deletions
				
			
		| 
						 | 
					@ -58,7 +58,7 @@ int nfsd_setuser(struct svc_rqst *rqstp, struct svc_export *exp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (i = 0; i < rqgi->ngroups; i++) {
 | 
							for (i = 0; i < rqgi->ngroups; i++) {
 | 
				
			||||||
			if (gid_eq(GLOBAL_ROOT_GID, GROUP_AT(rqgi, i)))
 | 
								if (gid_eq(GLOBAL_ROOT_GID, GROUP_AT(rqgi, i)))
 | 
				
			||||||
				GROUP_AT(gi, i) = make_kgid(&init_user_ns, exp->ex_anon_gid);
 | 
									GROUP_AT(gi, i) = exp->ex_anon_gid;
 | 
				
			||||||
			else
 | 
								else
 | 
				
			||||||
				GROUP_AT(gi, i) = GROUP_AT(rqgi, i);
 | 
									GROUP_AT(gi, i) = GROUP_AT(rqgi, i);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -544,13 +544,17 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
 | 
				
			||||||
		err = get_int(&mesg, &an_int);
 | 
							err = get_int(&mesg, &an_int);
 | 
				
			||||||
		if (err)
 | 
							if (err)
 | 
				
			||||||
			goto out3;
 | 
								goto out3;
 | 
				
			||||||
		exp.ex_anon_uid= an_int;
 | 
							exp.ex_anon_uid= make_kuid(&init_user_ns, an_int);
 | 
				
			||||||
 | 
							if (!uid_valid(exp.ex_anon_uid))
 | 
				
			||||||
 | 
								goto out3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* anon gid */
 | 
							/* anon gid */
 | 
				
			||||||
		err = get_int(&mesg, &an_int);
 | 
							err = get_int(&mesg, &an_int);
 | 
				
			||||||
		if (err)
 | 
							if (err)
 | 
				
			||||||
			goto out3;
 | 
								goto out3;
 | 
				
			||||||
		exp.ex_anon_gid= an_int;
 | 
							exp.ex_anon_gid= make_kgid(&init_user_ns, an_int);
 | 
				
			||||||
 | 
							if (!gid_valid(exp.ex_anon_gid))
 | 
				
			||||||
 | 
								goto out3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* fsid */
 | 
							/* fsid */
 | 
				
			||||||
		err = get_int(&mesg, &an_int);
 | 
							err = get_int(&mesg, &an_int);
 | 
				
			||||||
| 
						 | 
					@ -613,7 +617,7 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void exp_flags(struct seq_file *m, int flag, int fsid,
 | 
					static void exp_flags(struct seq_file *m, int flag, int fsid,
 | 
				
			||||||
		uid_t anonu, uid_t anong, struct nfsd4_fs_locations *fslocs);
 | 
							kuid_t anonu, kgid_t anong, struct nfsd4_fs_locations *fslocs);
 | 
				
			||||||
static void show_secinfo(struct seq_file *m, struct svc_export *exp);
 | 
					static void show_secinfo(struct seq_file *m, struct svc_export *exp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int svc_export_show(struct seq_file *m,
 | 
					static int svc_export_show(struct seq_file *m,
 | 
				
			||||||
| 
						 | 
					@ -1179,15 +1183,17 @@ static void show_secinfo(struct seq_file *m, struct svc_export *exp)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void exp_flags(struct seq_file *m, int flag, int fsid,
 | 
					static void exp_flags(struct seq_file *m, int flag, int fsid,
 | 
				
			||||||
		uid_t anonu, uid_t anong, struct nfsd4_fs_locations *fsloc)
 | 
							kuid_t anonu, kgid_t anong, struct nfsd4_fs_locations *fsloc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	show_expflags(m, flag, NFSEXP_ALLFLAGS);
 | 
						show_expflags(m, flag, NFSEXP_ALLFLAGS);
 | 
				
			||||||
	if (flag & NFSEXP_FSID)
 | 
						if (flag & NFSEXP_FSID)
 | 
				
			||||||
		seq_printf(m, ",fsid=%d", fsid);
 | 
							seq_printf(m, ",fsid=%d", fsid);
 | 
				
			||||||
	if (anonu != (uid_t)-2 && anonu != (0x10000-2))
 | 
						if (!uid_eq(anonu, make_kuid(&init_user_ns, (uid_t)-2)) &&
 | 
				
			||||||
		seq_printf(m, ",anonuid=%u", anonu);
 | 
						    !uid_eq(anonu, make_kuid(&init_user_ns, 0x10000-2)))
 | 
				
			||||||
	if (anong != (gid_t)-2 && anong != (0x10000-2))
 | 
							seq_printf(m, ",anonuid=%u", from_kuid(&init_user_ns, anonu));
 | 
				
			||||||
		seq_printf(m, ",anongid=%u", anong);
 | 
						if (!gid_eq(anong, make_kgid(&init_user_ns, (gid_t)-2)) &&
 | 
				
			||||||
 | 
						    !gid_eq(anong, make_kgid(&init_user_ns, 0x10000-2)))
 | 
				
			||||||
 | 
							seq_printf(m, ",anongid=%u", from_kgid(&init_user_ns, anong));
 | 
				
			||||||
	if (fsloc && fsloc->locations_count > 0) {
 | 
						if (fsloc && fsloc->locations_count > 0) {
 | 
				
			||||||
		char *loctype = (fsloc->migrated) ? "refer" : "replicas";
 | 
							char *loctype = (fsloc->migrated) ? "refer" : "replicas";
 | 
				
			||||||
		int i;
 | 
							int i;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -49,8 +49,8 @@ struct svc_export {
 | 
				
			||||||
	struct auth_domain *	ex_client;
 | 
						struct auth_domain *	ex_client;
 | 
				
			||||||
	int			ex_flags;
 | 
						int			ex_flags;
 | 
				
			||||||
	struct path		ex_path;
 | 
						struct path		ex_path;
 | 
				
			||||||
	uid_t			ex_anon_uid;
 | 
						kuid_t			ex_anon_uid;
 | 
				
			||||||
	gid_t			ex_anon_gid;
 | 
						kgid_t			ex_anon_gid;
 | 
				
			||||||
	int			ex_fsid;
 | 
						int			ex_fsid;
 | 
				
			||||||
	unsigned char *		ex_uuid; /* 16 byte fsid */
 | 
						unsigned char *		ex_uuid; /* 16 byte fsid */
 | 
				
			||||||
	struct nfsd4_fs_locations ex_fslocs;
 | 
						struct nfsd4_fs_locations ex_fslocs;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue