Blob Blame History Raw
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);