diff -up sudo-1.8.1p2/configure.in.getgrouplist sudo-1.8.1p2/configure.in --- sudo-1.8.1p2/configure.in.getgrouplist 2011-07-12 12:13:29.562597933 +0200 +++ sudo-1.8.1p2/configure.in 2011-07-12 12:15:27.116597851 +0200 @@ -2007,7 +2007,7 @@ dnl AC_FUNC_GETGROUPS AC_CHECK_FUNCS(strrchr sysconf tzset strftime initgroups getgroups fstat \ regcomp setlocale nl_langinfo getaddrinfo mbr_check_membership \ - setrlimit64 sysctl) + setrlimit64 sysctl getgrouplist) AC_CHECK_FUNCS(getline, [], [ AC_LIBOBJ(getline) AC_CHECK_FUNCS(fgetln) diff -up sudo-1.8.1p2/plugins/sudoers/pwutil.c.getgrouplist sudo-1.8.1p2/plugins/sudoers/pwutil.c --- sudo-1.8.1p2/plugins/sudoers/pwutil.c.getgrouplist 2011-07-12 12:13:17.346597942 +0200 +++ sudo-1.8.1p2/plugins/sudoers/pwutil.c 2011-07-12 12:19:02.171597700 +0200 @@ -711,6 +711,28 @@ user_in_group(struct passwd *pw, const c } #endif /* HAVE_MBR_CHECK_MEMBERSHIP */ +#ifdef HAVE_GETGROUPLIST + if (user_ngroups >= 0 && + strcmp(pw->pw_name, list_pw ? list_pw->pw_name : user_name) == 0) + { + 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); + retval = TRUE; + goto done; + } + free(grouplist); + } + } +#endif /* HAVE_GETGROUPLIST */ + done: if (grp != NULL) gr_delref(grp);