changeset 12278:0a3dcff9559e

getgroups: avoid calling exit rpl_getgroups should be a library function, comparable to glibc. * modules/getgroups (Depends-on): Add malloc-posix and unistd, drop xalloc. * modules/getgroups-tests (Depends-on, Makefile.am): Drop unneeded dependencies. * lib/getgroups.c (rpl_getgroups): Fail with ENOMEM rather than exiting, in the rare case of malloc failure. Signed-off-by: Eric Blake <ebb9@byu.net>
author Eric Blake <ebb9@byu.net>
date Thu, 12 Nov 2009 09:30:38 -0700
parents 502247708da6
children 6a41b8f5f874
files ChangeLog lib/getgroups.c modules/getgroups modules/getgroups-tests
diffstat 4 files changed, 22 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2009-11-13  Eric Blake  <ebb9@byu.net>
 
+	getgroups: avoid calling exit
+	* modules/getgroups (Depends-on): Add malloc-posix and unistd,
+	drop xalloc.
+	* modules/getgroups-tests (Depends-on, Makefile.am): Drop unneeded
+	dependencies.
+	* lib/getgroups.c (rpl_getgroups): Fail with ENOMEM rather than
+	exiting, in the rare case of malloc failure.
+
 	getgroups: fix logic error
 	* lib/getgroups.c (rpl_getgroups): Don't fail if current process
 	has more than 20 groups.
--- a/lib/getgroups.c
+++ b/lib/getgroups.c
@@ -20,20 +20,19 @@
 
 #include <config.h>
 
-#undef getgroups
+#include <unistd.h>
 
-#include <stdio.h>
-#include <sys/types.h>
 #include <errno.h>
 #include <stdlib.h>
-#include <unistd.h>
 
-#include "xalloc.h"
+#undef getgroups
 
-/* On at least Ultrix 4.3 and NextStep 3.2, getgroups (0, 0) always fails.
-   On other systems, it returns the number of supplemental groups for the
-   process.  This function handles that special case and lets the system-
-   provided function handle all others. */
+/* On at least Ultrix 4.3 and NextStep 3.2, getgroups (0, NULL) always
+   fails.  On other systems, it returns the number of supplemental
+   groups for the process.  This function handles that special case
+   and lets the system-provided function handle all others.  However,
+   it can fail with ENOMEM if memory is tight.  It is unspecified
+   whether the effective group id is included in the list.  */
 
 int
 rpl_getgroups (int n, GETGROUPS_T *group)
@@ -51,7 +50,9 @@
       /* No need to worry about address arithmetic overflow here,
          since the ancient systems that we're running on have low
          limits on the number of secondary groups.  */
-      gbuf = xmalloc (n * sizeof *gbuf);
+      gbuf = malloc (n * sizeof *gbuf);
+      if (!gbuf)
+        return -1;
       n_groups = getgroups (n, gbuf);
       if (n_groups == -1 ? errno != EINVAL : n_groups < n)
         break;
--- a/modules/getgroups
+++ b/modules/getgroups
@@ -6,7 +6,8 @@
 m4/getgroups.m4
 
 Depends-on:
-xalloc
+malloc-posix
+unistd
 
 configure.ac:
 gl_FUNC_GETGROUPS
@@ -20,5 +21,4 @@
 GPL
 
 Maintainer:
-Jim Meyering
-
+Jim Meyering, Eric Blake
--- a/modules/getgroups-tests
+++ b/modules/getgroups-tests
@@ -2,11 +2,9 @@
 tests/test-getgroups.c
 
 Depends-on:
-progname
 
 configure.ac:
 
 Makefile.am:
 TESTS += test-getgroups
 check_PROGRAMS += test-getgroups
-test_getgroups_LDADD = $(LDADD) @LIBINTL@