Commit d5497fc6 authored by J. Bruce Fields's avatar J. Bruce Fields

nfsd4: move rq_flavor into svc_cred

Move the rq_flavor into struct svc_cred, and use it in setclientid and
exchange_id comparisons as well.
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 8fbba96e
...@@ -10,7 +10,7 @@ int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export *exp) ...@@ -10,7 +10,7 @@ int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export *exp)
struct exp_flavor_info *end = exp->ex_flavors + exp->ex_nflavors; struct exp_flavor_info *end = exp->ex_flavors + exp->ex_nflavors;
for (f = exp->ex_flavors; f < end; f++) { for (f = exp->ex_flavors; f < end; f++) {
if (f->pseudoflavor == rqstp->rq_flavor) if (f->pseudoflavor == rqstp->rq_cred.cr_flavor)
return f->flags; return f->flags;
} }
return exp->ex_flags; return exp->ex_flags;
......
...@@ -904,13 +904,13 @@ __be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp) ...@@ -904,13 +904,13 @@ __be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp)
return 0; return 0;
/* ip-address based client; check sec= export option: */ /* ip-address based client; check sec= export option: */
for (f = exp->ex_flavors; f < end; f++) { for (f = exp->ex_flavors; f < end; f++) {
if (f->pseudoflavor == rqstp->rq_flavor) if (f->pseudoflavor == rqstp->rq_cred.cr_flavor)
return 0; return 0;
} }
/* defaults in absence of sec= options: */ /* defaults in absence of sec= options: */
if (exp->ex_nflavors == 0) { if (exp->ex_nflavors == 0) {
if (rqstp->rq_flavor == RPC_AUTH_NULL || if (rqstp->rq_cred.cr_flavor == RPC_AUTH_NULL ||
rqstp->rq_flavor == RPC_AUTH_UNIX) rqstp->rq_cred.cr_flavor == RPC_AUTH_UNIX)
return 0; return 0;
} }
return nfserr_wrongsec; return nfserr_wrongsec;
......
...@@ -605,7 +605,7 @@ numeric_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namel ...@@ -605,7 +605,7 @@ numeric_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namel
static __be32 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, uid_t *id)
{ {
if (nfs4_disable_idmapping && rqstp->rq_flavor < RPC_AUTH_GSS) if (nfs4_disable_idmapping && rqstp->rq_cred.cr_flavor < RPC_AUTH_GSS)
if (numeric_name_to_id(rqstp, type, name, namelen, id)) if (numeric_name_to_id(rqstp, type, name, namelen, id))
return 0; return 0;
/* /*
...@@ -618,7 +618,7 @@ do_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen, u ...@@ -618,7 +618,7 @@ do_name_to_id(struct svc_rqst *rqstp, int type, const char *name, u32 namelen, u
static int 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, uid_t id, char *name)
{ {
if (nfs4_disable_idmapping && rqstp->rq_flavor < RPC_AUTH_GSS) if (nfs4_disable_idmapping && rqstp->rq_cred.cr_flavor < RPC_AUTH_GSS)
return sprintf(name, "%u", id); return sprintf(name, "%u", id);
return idmap_id_to_name(rqstp, type, id, name); return idmap_id_to_name(rqstp, type, id, name);
} }
......
...@@ -1177,6 +1177,7 @@ static int copy_cred(struct svc_cred *target, struct svc_cred *source) ...@@ -1177,6 +1177,7 @@ static int copy_cred(struct svc_cred *target, struct svc_cred *source)
return -ENOMEM; return -ENOMEM;
} else } else
target->cr_principal = NULL; target->cr_principal = NULL;
target->cr_flavor = source->cr_flavor;
target->cr_uid = source->cr_uid; target->cr_uid = source->cr_uid;
target->cr_gid = source->cr_gid; target->cr_gid = source->cr_gid;
target->cr_group_info = source->cr_group_info; target->cr_group_info = source->cr_group_info;
...@@ -1213,11 +1214,11 @@ static bool groups_equal(struct group_info *g1, struct group_info *g2) ...@@ -1213,11 +1214,11 @@ static bool groups_equal(struct group_info *g1, struct group_info *g2)
return true; return true;
} }
/* XXX what about NGROUP */
static int static int
same_creds(struct svc_cred *cr1, struct svc_cred *cr2) same_creds(struct svc_cred *cr1, struct svc_cred *cr2)
{ {
if ((cr1->cr_uid != cr2->cr_uid) if ((cr1->cr_flavor != cr2->cr_flavor)
|| (cr1->cr_uid != cr2->cr_uid)
|| (cr1->cr_gid != cr2->cr_gid) || (cr1->cr_gid != cr2->cr_gid)
|| !groups_equal(cr1->cr_group_info, cr2->cr_group_info)) || !groups_equal(cr1->cr_group_info, cr2->cr_group_info))
return false; return false;
...@@ -1299,7 +1300,6 @@ static struct nfs4_client *create_client(struct xdr_netobj name, char *recdir, ...@@ -1299,7 +1300,6 @@ static struct nfs4_client *create_client(struct xdr_netobj name, char *recdir,
rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table"); rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table");
copy_verf(clp, verf); copy_verf(clp, verf);
rpc_copy_addr((struct sockaddr *) &clp->cl_addr, sa); rpc_copy_addr((struct sockaddr *) &clp->cl_addr, sa);
clp->cl_flavor = rqstp->rq_flavor;
gen_confirm(clp); gen_confirm(clp);
clp->cl_cb_session = NULL; clp->cl_cb_session = NULL;
return clp; return clp;
......
...@@ -232,7 +232,6 @@ struct svc_rqst { ...@@ -232,7 +232,6 @@ struct svc_rqst {
struct svc_pool * rq_pool; /* thread pool */ struct svc_pool * rq_pool; /* thread pool */
struct svc_procedure * rq_procinfo; /* procedure info */ struct svc_procedure * rq_procinfo; /* procedure info */
struct auth_ops * rq_authop; /* authentication flavour */ struct auth_ops * rq_authop; /* authentication flavour */
u32 rq_flavor; /* pseudoflavor */
struct svc_cred rq_cred; /* auth info */ struct svc_cred rq_cred; /* auth info */
void * rq_xprt_ctxt; /* transport specific context ptr */ void * rq_xprt_ctxt; /* transport specific context ptr */
struct svc_deferred_req*rq_deferred; /* deferred request we are replaying */ struct svc_deferred_req*rq_deferred; /* deferred request we are replaying */
......
...@@ -21,6 +21,7 @@ struct svc_cred { ...@@ -21,6 +21,7 @@ struct svc_cred {
uid_t cr_uid; uid_t cr_uid;
gid_t cr_gid; gid_t cr_gid;
struct group_info *cr_group_info; struct group_info *cr_group_info;
u32 cr_flavor; /* pseudoflavor */
char *cr_principal; /* for gss */ char *cr_principal; /* for gss */
}; };
......
...@@ -1202,7 +1202,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp) ...@@ -1202,7 +1202,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp)
} }
svcdata->rsci = rsci; svcdata->rsci = rsci;
cache_get(&rsci->h); cache_get(&rsci->h);
rqstp->rq_flavor = gss_svc_to_pseudoflavor( rqstp->rq_cred.cr_flavor = gss_svc_to_pseudoflavor(
rsci->mechctx->mech_type, gc->gc_svc); rsci->mechctx->mech_type, gc->gc_svc);
ret = SVC_OK; ret = SVC_OK;
goto out; goto out;
......
...@@ -768,7 +768,7 @@ svcauth_null_accept(struct svc_rqst *rqstp, __be32 *authp) ...@@ -768,7 +768,7 @@ svcauth_null_accept(struct svc_rqst *rqstp, __be32 *authp)
svc_putnl(resv, RPC_AUTH_NULL); svc_putnl(resv, RPC_AUTH_NULL);
svc_putnl(resv, 0); svc_putnl(resv, 0);
rqstp->rq_flavor = RPC_AUTH_NULL; rqstp->rq_cred.cr_flavor = RPC_AUTH_NULL;
return SVC_OK; return SVC_OK;
} }
...@@ -839,7 +839,7 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp) ...@@ -839,7 +839,7 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp)
svc_putnl(resv, RPC_AUTH_NULL); svc_putnl(resv, RPC_AUTH_NULL);
svc_putnl(resv, 0); svc_putnl(resv, 0);
rqstp->rq_flavor = RPC_AUTH_UNIX; rqstp->rq_cred.cr_flavor = RPC_AUTH_UNIX;
return SVC_OK; return SVC_OK;
badcred: badcred:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment