Ваша проблема здесь:
for( i=0; i < (sizeof(grp->gr_mem)/sizeof(grp->gr_mem[0])); i++ ){
struct group
определяется как:
struct group {
char *gr_name; /* group name */
char *gr_passwd; /* group password */
gid_t gr_gid; /* group ID */
char **gr_mem; /* NULL-terminated array of pointers
to names of group members */
};
Вы предполагаете, что gr_mem
- это массив, но это не так.Это указатель, указывающий на первый элемент массива.Так что sizeof(grp->gr_mem)/sizeof(grp->gr_mem[0])
дает вам размер указателя, вероятно, 8 в вашей системе.Поэтому, если у пользователя менее 8 групп, вы закончите чтение за концом массива gr_mem
указывает на начало.
Поскольку массив, на который указывает gr_mem
, завершается NULL,обнаружение этого терминатора говорит вам, когда цикл завершен:
for( i=0; grp->gr_mem[i]; i++ ){