diff -up sudo-1.7.4p4/configure.in.getgrouplist sudo-1.7.4p4/configure.in --- sudo-1.7.4p4/configure.in.getgrouplist 2010-09-07 15:53:38.400260828 +0200 +++ sudo-1.7.4p4/configure.in 2010-09-07 15:54:48.751188374 +0200 @@ -1913,7 +1913,7 @@ AC_FUNC_GETGROUPS AC_CHECK_FUNCS(strchr strrchr memchr memcpy memset sysconf tzset \ strftime setrlimit initgroups getgroups fstat gettimeofday \ regcomp setlocale getaddrinfo setenv vhangup \ - mbr_check_membership setrlimit64) + mbr_check_membership setrlimit64 getgrouplist) AC_CHECK_FUNCS(getline, [], [ AC_LIBOBJ(getline) AC_CHECK_FUNCS(fgetln) diff -up sudo-1.7.4p4/pwutil.c.getgrouplist sudo-1.7.4p4/pwutil.c --- sudo-1.7.4p4/pwutil.c.getgrouplist 2010-09-07 15:53:26.816198477 +0200 +++ sudo-1.7.4p4/pwutil.c 2010-09-07 15:54:16.990188543 +0200 @@ -628,5 +628,23 @@ user_in_group(pw, group) } #endif /* HAVE_MBR_CHECK_MEMBERSHIP */ +#ifdef HAVE_GETGROUPLIST + { + gid_t *grouplist, grouptmp; + int n_groups, i; + n_groups = 1; + if (getgrouplist(user_name, user_gid, &grouptmp, &n_groups) == -1) { + grouplist = (gid_t *) emalloc(sizeof(gid_t) * (n_groups + 1)); + if (getgrouplist(user_name, user_gid, grouplist, &n_groups) > 0) + for (i = 0; i < n_groups; i++) + if (grouplist[i] == grp->gr_gid) { + free(grouplist); + return(TRUE); + } + free(grouplist); + } + } +#endif /* HAVE_GETGROUPLIST */ + return(FALSE); }