diff options
author | Ulrich Drepper <drepper@redhat.com> | 1998-10-22 11:49:29 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1998-10-22 11:49:29 +0000 |
commit | 9271a050b5af6594ab112a9c116854953b041d8f (patch) | |
tree | 4e858e3b7bedaaba8122e7ef378313192ae9653f /sysdeps/unix/sysv/linux/i386/getgroups.c | |
parent | e595c802ca9a9eb2c7d5e72cb7b9437d25063c97 (diff) | |
download | glibc-9271a050b5af6594ab112a9c116854953b041d8f.tar.gz glibc-9271a050b5af6594ab112a9c116854953b041d8f.tar.xz glibc-9271a050b5af6594ab112a9c116854953b041d8f.zip |
Update.
1998-10-22 H.J. Lu <hjl@gnu.org> * sysdeps/unix/sysv/linux/i386/getgroups.c (__getgroups): Add sanity check for n. * sysdeps/unix/sysv/linux/i386/setgroups.c (setgroups): Likewise. * sysdeps/posix/fpathconf.c (__fpathconf): Set errno to EINVAL if errno == ENODEV. Tested by VSX-PCT. * sysdeps/posix/isatty.c (__isatty): Don't reset errno. Tested by VSX-PCT. * posix/execvp.c (execvp): Check "". Tested by VSX-PCT.
Diffstat (limited to 'sysdeps/unix/sysv/linux/i386/getgroups.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/getgroups.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/getgroups.c b/sysdeps/unix/sysv/linux/i386/getgroups.c index c306dd1268..5484f72f1c 100644 --- a/sysdeps/unix/sysv/linux/i386/getgroups.c +++ b/sysdeps/unix/sysv/linux/i386/getgroups.c @@ -17,10 +17,13 @@ Boston, MA 02111-1307, USA. */ #include <errno.h> -#include <sys/types.h> #include <unistd.h> +#include <sys/param.h> +#include <sys/types.h> #include <sysdep.h> +#include <sys/syscall.h> + #include <linux/posix_types.h> extern int __syscall_getgroups __P ((int, __kernel_gid_t *)); @@ -32,14 +35,23 @@ __getgroups (n, groups) int n; gid_t *groups; { - int i, ngids; - __kernel_gid_t kernel_groups[n]; - - ngids = INLINE_SYSCALL (getgroups, 2, n, kernel_groups); - if (n != 0 && ngids > 0) - for (i = 0; i < ngids; i++) - groups[i] = kernel_groups[i]; - return ngids; + if (n < 0) + { + __set_errno (EINVAL); + return -1; + } + else + { + int i, ngids; + __kernel_gid_t kernel_groups[n = MIN (n, __sysconf (_SC_NGROUPS_MAX))]; + + ngids = INLINE_SYSCALL (getgroups, 2, n, kernel_groups); + if (n != 0 && ngids > 0) + for (i = 0; i < ngids; i++) + groups[i] = kernel_groups[i]; + + return ngids; + } } weak_alias (__getgroups, getgroups) |