components/sudo/patches/getgrset.patch
author Vladimir Marek <Vladimir.Marek@oracle.com>
Sat, 19 Jan 2013 16:54:22 +0100
changeset 1133 d8e2284538ee
permissions -rw-r--r--
16195225 use _getgroupsbymember() instead of slow getgrent() calls
This patch is using solaris private interface _getgroupsbymember(). We should
switch to similar public interface once Solaris has one.

--- sudo-1.8.4p5/compat/getgrouplist.c	Sat Jan 19 22:45:01 2013
+++ sudo-1.8.4p5/compat/getgrouplist.c	Sat Jan 19 22:44:59 2013
@@ -36,6 +36,15 @@
 
 #include "missing.h"
 
+#ifdef HAVE__GETGRPSBYMEMBER
+extern int _getgroupsbymember
+(
+    const char* username, gid_t gid_array[],
+    int maxgids, int numgids
+); 
+#endif /* HAVE__GETGRPSBYMEMBER */
+
+
 #ifdef HAVE_GETGRSET
 /*
  * BSD-compatible getgrouplist(3) using getgrset(3)
@@ -81,6 +90,25 @@
 
 #else /* HAVE_GETGRSET */
 
+#ifdef HAVE__GETGRPSBYMEMBER
+int
+getgrouplist(const char *name, gid_t basegid, gid_t *groups, int *ngroupsp)
+{
+    int grpsize = *ngroupsp;
+
+    if (grpsize <= 0)
+	return -1;
+    groups[0] = basegid;
+
+    if ((grpsize = _getgroupsbymember(name, groups, grpsize, 1)) == -1)
+	return -1;
+
+    *ngroupsp = grpsize;
+    return 0;
+}
+
+#else /* ! HAVE__GETGRPSBYMEMBER */
+
 /*
  * BSD-compatible getgrouplist(3) using getgrent(3)
  */
@@ -128,4 +156,7 @@
 
     return rval;
 }
+
+#endif /* ! HAVE__GETGRPSBYMEMBER */
+
 #endif /* HAVE_GETGRSET */