mirror of
https://github.com/freebsd/freebsd-src.git
synced 2026-10-28 19:34:43 +01:00
hwpmc: On attach, ensure owner is a target effective GID's member
This restores a check that existed prior to commitbe1f7435ef("kern: start tracking cr_gid outside of cr_groups[]"). While here, improve pmc_can_attach()'s style by changing the type of 'decline_attach' to 'bool', fixing tests on it, adding missing parentheses to 'return' statements, and by changing its return value type to 'bool'. Fixes:be1f7435ef("kern: start tracking cr_gid outside of cr_groups[]") MFC after: 9 days Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D52252
This commit is contained in:
1 file changed
+10
-11
+10
-11
@@ -210,7 +210,7 @@ static int pmc_attach_one_process(struct proc *p, struct pmc *pm);
|
||||
static bool pmc_can_allocate_row(int ri, enum pmc_mode mode);
|
||||
static bool pmc_can_allocate_rowindex(struct proc *p, unsigned int ri,
|
||||
int cpu);
|
||||
static int pmc_can_attach(struct pmc *pm, struct proc *p);
|
||||
static bool pmc_can_attach(struct pmc *pm, struct proc *p);
|
||||
static void pmc_capture_user_callchain(int cpu, int soft,
|
||||
struct trapframe *tf);
|
||||
static void pmc_cleanup(void);
|
||||
@@ -1029,19 +1029,19 @@ pmc_unlink_target_process(struct pmc *pm, struct pmc_process *pp)
|
||||
* Check if PMC 'pm' may be attached to target process 't'.
|
||||
*/
|
||||
|
||||
static int
|
||||
static bool
|
||||
pmc_can_attach(struct pmc *pm, struct proc *t)
|
||||
{
|
||||
struct proc *o; /* pmc owner */
|
||||
struct ucred *oc, *tc; /* owner, target credentials */
|
||||
int decline_attach, i;
|
||||
bool decline_attach;
|
||||
|
||||
/*
|
||||
* A PMC's owner can always attach that PMC to itself.
|
||||
*/
|
||||
|
||||
if ((o = pm->pm_owner->po_owner) == t)
|
||||
return 0;
|
||||
return (false);
|
||||
|
||||
PROC_LOCK(o);
|
||||
oc = o->p_ucred;
|
||||
@@ -1066,18 +1066,17 @@ pmc_can_attach(struct pmc *pm, struct proc *t)
|
||||
* Every one of the target's group ids, must be in the owner's
|
||||
* group list.
|
||||
*/
|
||||
for (i = 0; !decline_attach && i < tc->cr_ngroups; i++)
|
||||
for (int i = 0; !decline_attach && i < tc->cr_ngroups; i++)
|
||||
decline_attach = !groupmember(tc->cr_groups[i], oc);
|
||||
|
||||
/* check the read and saved gids too */
|
||||
if (decline_attach == 0)
|
||||
decline_attach = !groupmember(tc->cr_rgid, oc) ||
|
||||
if (!decline_attach)
|
||||
decline_attach = !groupmember(tc->cr_gid, oc) ||
|
||||
!groupmember(tc->cr_rgid, oc) ||
|
||||
!groupmember(tc->cr_svgid, oc);
|
||||
|
||||
crfree(tc);
|
||||
crfree(oc);
|
||||
|
||||
return !decline_attach;
|
||||
return (!decline_attach);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1412,7 +1411,7 @@ pmc_process_exec(struct thread *td, struct pmckern_procexec *pk)
|
||||
*/
|
||||
for (ri = 0; ri < md->pmd_npmc; ri++) {
|
||||
if ((pm = pp->pp_pmcs[ri].pp_pmc) != NULL) {
|
||||
if (pmc_can_attach(pm, td->td_proc) != 0) {
|
||||
if (pmc_can_attach(pm, td->td_proc)) {
|
||||
pmc_detach_one_process(td->td_proc, pm,
|
||||
PMC_FLAG_NONE);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user