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:
Olivier Certner
2025-08-28 16:49:07 +02:00
parent e4cc7f9930
commit 11cbb7d122
+7 -3
View File
@@ -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);
}