afs: Introduce afs_IsPagId()

Many places in the code contain a check like this, in order to check
if a given uid number represents a PAG:

    if (((uid >> 24) & 0xff) == 'A')

Consolidate these checks into a single function, called afs_IsPagId.

Change-Id: I8b9e9a8fc07672a3e1edfd2eff8227d8c2558a0a
Reviewed-on: https://gerrit.openafs.org/14086
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
This commit is contained in:
Andrew Deason 2020-01-15 17:39:39 -06:00 committed by Michael Meffie
parent 134b671171
commit c856bd9c87
11 changed files with 25 additions and 15 deletions

View File

@ -74,7 +74,7 @@ Afs_xsetgroups(p, args, retval)
pcred_unlock(p); pcred_unlock(p);
if (PagInCred(cr) == NOPAG) { if (PagInCred(cr) == NOPAG) {
if (((treq.uid >> 24) & 0xff) == 'A') { if (afs_IsPagId(treq.uid)) {
AFS_GLOCK(); AFS_GLOCK();
/* we've already done a setpag, so now we redo it */ /* we've already done a setpag, so now we redo it */
AddPag(p, treq.uid, &cr); AddPag(p, treq.uid, &cr);

View File

@ -58,7 +58,7 @@ Afs_xsetgroups(struct thread *td, struct setgroups_args *uap)
cr = crdup(td->td_ucred); cr = crdup(td->td_ucred);
if (PagInCred(cr) == NOPAG) { if (PagInCred(cr) == NOPAG) {
if (((treq.uid >> 24) & 0xff) == 'A') { if (afs_IsPagId(treq.uid)) {
AFS_GLOCK(); AFS_GLOCK();
/* we've already done a setpag, so now we redo it */ /* we've already done a setpag, so now we redo it */
AddPag(td, treq.uid, &cr); AddPag(td, treq.uid, &cr);

View File

@ -47,7 +47,7 @@ Afs_xsetgroups()
* overwrite it with the old pag. * overwrite it with the old pag.
*/ */
if (PagInCred(p_cred(u.u_procp)) == NOPAG) { if (PagInCred(p_cred(u.u_procp)) == NOPAG) {
if (((treq.uid >> 24) & 0xff) == 'A') { if (afs_IsPagId(treq.uid)) {
struct ucred *cred; struct ucred *cred;
AFS_GLOCK(); AFS_GLOCK();
/* we've already done a setpag, so now we redo it */ /* we've already done a setpag, so now we redo it */

View File

@ -67,7 +67,7 @@ fixup_pags(int **credpp, int ngroups, gid_t * gidset, int old_afs_pag,
} }
if (ngroups >= 1) { /* possibly a DFS PAG */ if (ngroups >= 1) { /* possibly a DFS PAG */
new_dfs_pag = (int)groups[ngroups - 1]; new_dfs_pag = (int)groups[ngroups - 1];
if (((new_dfs_pag >> 24) & 0xff) == 'A') if (afs_IsPagId(new_dfs_pag))
new_dfs_pag = (int)groups[ngroups - 1]; new_dfs_pag = (int)groups[ngroups - 1];
else else
new_dfs_pag = 0; new_dfs_pag = 0;
@ -138,7 +138,7 @@ osi_DFSGetPagFromCred(struct ucred *credp)
* the first or third group entry. * the first or third group entry.
*/ */
pag = credp->cr_groups[ngroups - 1]; pag = credp->cr_groups[ngroups - 1];
if (((pag >> 24) & 0xff) == 'A') if (afs_IsPagId(pag))
return pag; return pag;
else else
return NOPAG; return NOPAG;

View File

@ -39,7 +39,7 @@ afs_linux_pag_from_groups(struct group_info *group_info)
for (i = 0; i < group_info->ngroups; i++) { for (i = 0; i < group_info->ngroups; i++) {
g0 = afs_from_kgid(GROUP_AT(group_info, i)); g0 = afs_from_kgid(GROUP_AT(group_info, i));
if (((g0 >> 24) & 0xff) == 'A') if (afs_IsPagId(g0))
return g0; return g0;
} }
return NOPAG; return NOPAG;
@ -61,7 +61,7 @@ afs_linux_pag_to_groups(afs_uint32 newpag,
for (i = 0, j = 0; i < old->ngroups; ++i) { for (i = 0, j = 0; i < old->ngroups; ++i) {
afs_kgid_t ths = GROUP_AT(old, i); afs_kgid_t ths = GROUP_AT(old, i);
if ((afs_from_kgid(ths) >> 24) == 'A') if (afs_IsPagId(afs_from_kgid(ths)))
continue; continue;
if ((i == 0 || !gid_lt(newkgid, GROUP_AT(old, i - 1))) && if ((i == 0 || !gid_lt(newkgid, GROUP_AT(old, i - 1))) &&
gid_lt(newkgid, ths)) { gid_lt(newkgid, ths)) {
@ -658,7 +658,7 @@ osi_get_keyring_pag(afs_ucred_t *cred)
/* Only set PAG in groups if needed, /* Only set PAG in groups if needed,
* and the creds are from the current process */ * and the creds are from the current process */
if (afs_linux_cred_is_current(cred) && if (afs_linux_cred_is_current(cred) &&
((keyring_pag >> 24) & 0xff) == 'A' && afs_IsPagId(keyring_pag) &&
keyring_pag != afs_linux_pag_from_groups(current_group_info())) { keyring_pag != afs_linux_pag_from_groups(current_group_info())) {
__setpag(&cred, keyring_pag, &newpag, 0, NULL); __setpag(&cred, keyring_pag, &newpag, 0, NULL);

View File

@ -65,7 +65,7 @@ Afs_xsetgroups(afs_proc_t *p, const void *args, register_t *retval)
* overwrite it with the old pag. * overwrite it with the old pag.
*/ */
if (PagInCred(cred) == NOPAG) { if (PagInCred(cred) == NOPAG) {
if (((treq.uid >> 24) & 0xff) == 'A') { if (afs_IsPagId(treq.uid)) {
AFS_GLOCK(); AFS_GLOCK();
/* we've already done a setpag, so now we redo it */ /* we've already done a setpag, so now we redo it */
AddPag(p, treq.uid, &cred); AddPag(p, treq.uid, &cred);

View File

@ -61,7 +61,7 @@ Afs_xsetgroups(p, args, retval)
* overwrite it with the old pag. * overwrite it with the old pag.
*/ */
if (PagInCred(p->p_rcred) == NOPAG) { if (PagInCred(p->p_rcred) == NOPAG) {
if (((treq.uid >> 24) & 0xff) == 'A') { if (afs_IsPagId(treq.uid)) {
AFS_GLOCK(); AFS_GLOCK();
/* we've already done a setpag, so now we redo it */ /* we've already done a setpag, so now we redo it */
AddPag(p, treq.uid, &p->p_rcred); AddPag(p, treq.uid, &p->p_rcred);

View File

@ -60,7 +60,7 @@ afs_xsetgroups(u_int uap, gid_t *rvp)
* overwrite it with the old pag. * overwrite it with the old pag.
*/ */
if (PagInCred(proc->p_cred) == NOPAG) { if (PagInCred(proc->p_cred) == NOPAG) {
if (((treq.uid >> 24) & 0xff) == 'A') { if (afs_IsPagId(treq.uid)) {
AFS_GLOCK(); AFS_GLOCK();
/* we've already done a setpag, so now we redo it */ /* we've already done a setpag, so now we redo it */
AddPag(treq.uid, &proc->p_cred); AddPag(treq.uid, &proc->p_cred);
@ -93,7 +93,7 @@ pag_to_gidset(afs_uint32 pagvalue, gid_t *gidset, int *a_ngroups,
/* See if we already have a PAG gid */ /* See if we already have a PAG gid */
for (i = 0; i < ngroups; i++) { for (i = 0; i < ngroups; i++) {
if (((gidset[i] >> 24) & 0xff) == 'A') { if (afs_IsPagId(gidset[i])) {
gidslot = &gidset[i]; gidslot = &gidset[i];
break; break;
} }
@ -276,7 +276,7 @@ osi_get_group_pag(struct cred *cred) {
ngroups = crgetngroups(cred); ngroups = crgetngroups(cred);
for (i = 0; i < ngroups; i++) { for (i = 0; i < ngroups; i++) {
if (((gidset[i] >> 24) & 0xff) == 'A') { if (afs_IsPagId(gidset[i])) {
return gidset[i]; return gidset[i];
} }
} }

View File

@ -575,7 +575,7 @@ afs_get_pag_from_groups(gid_t g0a, gid_t g1a)
return ret; return ret;
# else # else
/* Additional testing */ /* Additional testing */
if (((ret >> 24) & 0xff) == 'A') if (afs_IsPagId(ret))
return ret; return ret;
# endif /* UKERNEL */ # endif /* UKERNEL */
} }
@ -713,3 +713,12 @@ PagInCred(afs_ucred_t *cred)
#endif #endif
return pag; return pag;
} }
int
afs_IsPagId(afs_uint32 id)
{
if (((id >> 24) & 0xff) == 'A') {
return 1;
}
return 0;
}

View File

@ -541,6 +541,7 @@ extern void afs_DestroyReq(struct vrequest *av);
extern afs_uint32 afs_get_pag_from_groups(gid_t g0a, gid_t g1a); extern afs_uint32 afs_get_pag_from_groups(gid_t g0a, gid_t g1a);
extern void afs_get_groups_from_pag(afs_uint32 pag, gid_t * g0p, gid_t * g1p); extern void afs_get_groups_from_pag(afs_uint32 pag, gid_t * g0p, gid_t * g1p);
extern afs_int32 PagInCred(afs_ucred_t *cred); extern afs_int32 PagInCred(afs_ucred_t *cred);
extern int afs_IsPagId(afs_uint32 id);
/* afs_osi_uio.c */ /* afs_osi_uio.c */
#if !defined(AFS_DARWIN80_ENV) #if !defined(AFS_DARWIN80_ENV)

View File

@ -782,7 +782,7 @@ afs_GCPAGs(afs_int32 * ReleasedCount)
for (i = 0; i < NUSERS; i++) { for (i = 0; i < NUSERS; i++) {
for (pu = afs_users[i]; pu; pu = pu->next) { for (pu = afs_users[i]; pu; pu = pu->next) {
pu->states |= TMP_UPAGNotReferenced; pu->states |= TMP_UPAGNotReferenced;
if (((pu->uid >> 24) & 0xff) != 'A') { if (afs_IsPagId(pu->uid)) {
/* this is a uid-based token, */ /* this is a uid-based token, */
/* increment the count */ /* increment the count */
afs_GCPAGs_UIDBaseTokenCount++; afs_GCPAGs_UIDBaseTokenCount++;