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);
}
      This page is part of release 2.79 of the Linux man-pages project. A
      description of the project, and information about reporting
      bugs, can be found at
      http://www.kernel.org/doc/man-pages/.
| 
                 Copyright 2002 Walter Harms (walter.harmsinformatik.uni-oldenburg.de) Distributed under GPL Thanks to glibc info pages Modified 2003-11-18, aeb: glibc is broken  |