libprocstat: procstat_getgroups_kvm(): Output again the effective GID
In particular, fixes 'procstat -s -M' (for processes with more than 16
groups).
Reviewed by: kib
Fixes: be1f7435ef ("kern: start tracking cr_gid outside of cr_groups[]")
MFC after: 5 days
MFC to: stable/15
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D52275
This commit is contained in:
@@ -1973,6 +1973,7 @@ procstat_getgroups_kvm(kvm_t *kd, struct kinfo_proc *kp, unsigned int *cntp)
|
||||
struct ucred ucred;
|
||||
gid_t *groups;
|
||||
size_t len;
|
||||
unsigned int ngroups;
|
||||
|
||||
assert(kd != NULL);
|
||||
assert(kp != NULL);
|
||||
@@ -1990,19 +1991,22 @@ procstat_getgroups_kvm(kvm_t *kd, struct kinfo_proc *kp, unsigned int *cntp)
|
||||
proc.p_ucred, kp->ki_pid);
|
||||
return (NULL);
|
||||
}
|
||||
len = ucred.cr_ngroups * sizeof(gid_t);
|
||||
ngroups = 1 + ucred.cr_ngroups;
|
||||
len = ngroups * sizeof(gid_t);
|
||||
groups = malloc(len);
|
||||
if (groups == NULL) {
|
||||
warn("malloc(%zu)", len);
|
||||
return (NULL);
|
||||
}
|
||||
if (!kvm_read_all(kd, (unsigned long)ucred.cr_groups, groups, len)) {
|
||||
groups[0] = ucred.cr_gid;
|
||||
if (!kvm_read_all(kd, (unsigned long)ucred.cr_groups, groups + 1,
|
||||
len - sizeof(gid_t))) {
|
||||
warnx("can't read groups at %p for pid %d",
|
||||
ucred.cr_groups, kp->ki_pid);
|
||||
free(groups);
|
||||
return (NULL);
|
||||
}
|
||||
*cntp = ucred.cr_ngroups;
|
||||
*cntp = ngroups;
|
||||
return (groups);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user