getgrouplist — list of groups a user belongs to
#include <grp.h>
int
getgrouplist( |
const char * | user, |
gid_t | group, | |
gid_t * | groups, | |
int * | ngroups) ; |
![]() |
Note | ||
---|---|---|---|
|
The getgrouplist
() function
scans the group database for all the groups user
belongs to. Up to
*ngroups
group IDs
corresponding to these groups are stored in the array
groups
; the return
value from the function is the number of group IDs actually
stored. The group group
is automatically included
in the list of groups returned by getgrouplist
().
If *ngroups
is
smaller than the total number of groups found, then
getgrouplist
() returns
−1. In all cases the actual number of groups is stored
in *ngroups
.
The glibc 2.3.2 implementation of this function is broken:
it overwrites memory when the actual number of groups is
larger than *ngroups
.
/* This crashes with glibc 2.3.2 */ #include <stdio.h> #include <stdlib.h> #include <grp.h> #include <pwd.h> int main(void) { int i, ng = 0; char *user = "who"; /* username here */ gid_t *groups = NULL; struct passwd *pw = getpwnam(user); if (pw == NULL) exit(EXIT_SUCCESS); if (getgrouplist(user, pw−>pw_gid, NULL, &ng) < 0) { groups = (gid_t *) malloc(ng * sizeof (gid_t)); getgrouplist(user, pw−>pw_gid, groups, &ng); } for (i = 0; i < ng; i++) printf("%d\n", groups[i]); exit(EXIT_SUCCESS); }