Contributors: 15
Author |
Tokens |
Token Proportion |
Commits |
Commit Proportion |
David Howells |
138 |
29.42% |
4 |
13.33% |
Linus Torvalds (pre-git) |
133 |
28.36% |
6 |
20.00% |
J. Bruce Fields |
76 |
16.20% |
5 |
16.67% |
Andrew Morton |
38 |
8.10% |
3 |
10.00% |
Eric W. Biedermann |
33 |
7.04% |
2 |
6.67% |
Alexey Dobriyan |
16 |
3.41% |
1 |
3.33% |
Andrew G. Morgan |
10 |
2.13% |
1 |
3.33% |
Neil Brown |
9 |
1.92% |
1 |
3.33% |
Thiago Rafael Becker |
6 |
1.28% |
1 |
3.33% |
Harvey Harrison |
3 |
0.64% |
1 |
3.33% |
Kinglong Mee |
2 |
0.43% |
1 |
3.33% |
Jeff Layton |
2 |
0.43% |
1 |
3.33% |
Greg Kroah-Hartman |
1 |
0.21% |
1 |
3.33% |
Ben Hutchings |
1 |
0.21% |
1 |
3.33% |
Boaz Harrosh |
1 |
0.21% |
1 |
3.33% |
Total |
469 |
|
30 |
|
// SPDX-License-Identifier: GPL-2.0
/* Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de> */
#include <linux/sched.h>
#include "nfsd.h"
#include "auth.h"
int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export *exp)
{
struct exp_flavor_info *f;
struct exp_flavor_info *end = exp->ex_flavors + exp->ex_nflavors;
for (f = exp->ex_flavors; f < end; f++) {
if (f->pseudoflavor == rqstp->rq_cred.cr_flavor)
return f->flags;
}
return exp->ex_flags;
}
int nfsd_setuser(struct svc_rqst *rqstp, struct svc_export *exp)
{
struct group_info *rqgi;
struct group_info *gi;
struct cred *new;
int i;
int flags = nfsexp_flags(rqstp, exp);
/* discard any old override before preparing the new set */
revert_creds(get_cred(current_real_cred()));
new = prepare_creds();
if (!new)
return -ENOMEM;
new->fsuid = rqstp->rq_cred.cr_uid;
new->fsgid = rqstp->rq_cred.cr_gid;
rqgi = rqstp->rq_cred.cr_group_info;
if (flags & NFSEXP_ALLSQUASH) {
new->fsuid = exp->ex_anon_uid;
new->fsgid = exp->ex_anon_gid;
gi = groups_alloc(0);
if (!gi)
goto oom;
} else if (flags & NFSEXP_ROOTSQUASH) {
if (uid_eq(new->fsuid, GLOBAL_ROOT_UID))
new->fsuid = exp->ex_anon_uid;
if (gid_eq(new->fsgid, GLOBAL_ROOT_GID))
new->fsgid = exp->ex_anon_gid;
gi = groups_alloc(rqgi->ngroups);
if (!gi)
goto oom;
for (i = 0; i < rqgi->ngroups; i++) {
if (gid_eq(GLOBAL_ROOT_GID, rqgi->gid[i]))
gi->gid[i] = exp->ex_anon_gid;
else
gi->gid[i] = rqgi->gid[i];
}
/* Each thread allocates its own gi, no race */
groups_sort(gi);
} else {
gi = get_group_info(rqgi);
}
if (uid_eq(new->fsuid, INVALID_UID))
new->fsuid = exp->ex_anon_uid;
if (gid_eq(new->fsgid, INVALID_GID))
new->fsgid = exp->ex_anon_gid;
set_groups(new, gi);
put_group_info(gi);
if (!uid_eq(new->fsuid, GLOBAL_ROOT_UID))
new->cap_effective = cap_drop_nfsd_set(new->cap_effective);
else
new->cap_effective = cap_raise_nfsd_set(new->cap_effective,
new->cap_permitted);
put_cred(override_creds(new));
put_cred(new);
return 0;
oom:
abort_creds(new);
return -ENOMEM;
}