Mercurial > hg > octave-nkf > gnulib-hg
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;