Commit 8fbba96e authored by J. Bruce Fields's avatar J. Bruce Fields

nfsd4: stricter cred comparison for setclientid/exchange_id

The typical setclientid or exchange_id will probably be performed with a
credential that maps to either root or nobody, so comparing just uid's
is unlikely to be useful.  So, use everything else we can get our hands
on.
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 03a4e1f6
...@@ -1201,11 +1201,31 @@ same_clid(clientid_t *cl1, clientid_t *cl2) ...@@ -1201,11 +1201,31 @@ same_clid(clientid_t *cl1, clientid_t *cl2)
return (cl1->cl_boot == cl2->cl_boot) && (cl1->cl_id == cl2->cl_id); return (cl1->cl_boot == cl2->cl_boot) && (cl1->cl_id == cl2->cl_id);
} }
static bool groups_equal(struct group_info *g1, struct group_info *g2)
{
int i;
if (g1->ngroups != g2->ngroups)
return false;
for (i=0; i<g1->ngroups; i++)
if (GROUP_AT(g1, i) != GROUP_AT(g2, i))
return false;
return true;
}
/* XXX what about NGROUP */ /* 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)
{ {
return cr1->cr_uid == cr2->cr_uid; if ((cr1->cr_uid != cr2->cr_uid)
|| (cr1->cr_gid != cr2->cr_gid)
|| !groups_equal(cr1->cr_group_info, cr2->cr_group_info))
return false;
if (cr1->cr_principal == cr2->cr_principal)
return true;
if (!cr1->cr_principal || !cr2->cr_principal)
return false;
return 0 == strcmp(cr1->cr_principal, cr1->cr_principal);
} }
static void gen_clid(struct nfs4_client *clp) static void gen_clid(struct nfs4_client *clp)
......
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