/* * Match credentials against current process creds. */ static int generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) { struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); int i; if (acred->machine_cred) return machine_cred_match(acred, gcred, flags); if (!uid_eq(gcred->acred.uid, acred->uid) || !gid_eq(gcred->acred.gid, acred->gid) || gcred->acred.machine_cred != 0) goto out_nomatch; /* Optimisation in the case where pointers are identical... */ if (gcred->acred.group_info == acred->group_info) goto out_match; /* Slow path... */ if (gcred->acred.group_info->ngroups != acred->group_info->ngroups) goto out_nomatch; for (i = 0; i < gcred->acred.group_info->ngroups; i++) { if (!gid_eq(GROUP_AT(gcred->acred.group_info, i), GROUP_AT(acred->group_info, i))) goto out_nomatch; } out_match: return 1; out_nomatch: return 0; }
static int generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags) { struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base); int i; if (acred->machine_cred) return machine_cred_match(acred, gcred, flags); if (gcred->acred.uid != acred->uid || gcred->acred.gid != acred->gid || gcred->acred.machine_cred != 0) goto out_nomatch; if (gcred->acred.group_info == acred->group_info) goto out_match; if (gcred->acred.group_info->ngroups != acred->group_info->ngroups) goto out_nomatch; for (i = 0; i < gcred->acred.group_info->ngroups; i++) { if (GROUP_AT(gcred->acred.group_info, i) != GROUP_AT(acred->group_info, i)) goto out_nomatch; } out_match: return 1; out_nomatch: return 0; }