diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/i386/setgroups.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/setgroups.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/sysdeps/unix/sysv/linux/i386/setgroups.c b/sysdeps/unix/sysv/linux/i386/setgroups.c index ad2a6b5493..67197e6f06 100644 --- a/sysdeps/unix/sysv/linux/i386/setgroups.c +++ b/sysdeps/unix/sysv/linux/i386/setgroups.c @@ -36,18 +36,26 @@ setgroups (n, groups) size_t n; const gid_t *groups; { - size_t i; - __kernel_gid_t kernel_groups[n]; - - for (i = 0; i < n; i++) + if (n < 0 || n > __sysconf (_SC_NGROUPS_MAX)) + { + __set_errno (EINVAL); + return -1; + } + else if { - kernel_groups[i] = groups[i]; - if (groups[i] != (gid_t) ((__kernel_gid_t) groups[i])) + size_t i; + __kernel_gid_t kernel_groups[n]; + + for (i = 0; i < n; i++) { - __set_errno (EINVAL); - return -1; + kernel_groups[i] = groups[i]; + if (groups[i] != (gid_t) ((__kernel_gid_t) groups[i])) + { + __set_errno (EINVAL); + return -1; + } } - } - return INLINE_SYSCALL (setgroups, 2, n, kernel_groups); + return INLINE_SYSCALL (setgroups, 2, n, kernel_groups); + } } |