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.
#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)
/* 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;