getgroups: avoid calling exit
authorEric Blake <ebb9@byu.net>
Thu, 12 Nov 2009 16:30:38 +0000 (09:30 -0700)
committerEric Blake <ebb9@byu.net>
Fri, 13 Nov 2009 14:39:01 +0000 (07:39 -0700)
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>
ChangeLog
lib/getgroups.c
modules/getgroups
modules/getgroups-tests

index 099f1ee..86e3bf8 100644 (file)
--- 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.
index 207a441..e764d73 100644 (file)
 
 #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 @@ rpl_getgroups (int n, GETGROUPS_T *group)
       /* 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;
index 16604f8..472d20e 100644 (file)
@@ -6,7 +6,8 @@ lib/getgroups.c
 m4/getgroups.m4
 
 Depends-on:
-xalloc
+malloc-posix
+unistd
 
 configure.ac:
 gl_FUNC_GETGROUPS
@@ -20,5 +21,4 @@ License:
 GPL
 
 Maintainer:
-Jim Meyering
-
+Jim Meyering, Eric Blake
index f879e49..2a52621 100644 (file)
@@ -2,11 +2,9 @@ Files:
 tests/test-getgroups.c
 
 Depends-on:
-progname
 
 configure.ac:
 
 Makefile.am:
 TESTS += test-getgroups
 check_PROGRAMS += test-getgroups
-test_getgroups_LDADD = $(LDADD) @LIBINTL@