diff options
author | DJ Delorie <dj@redhat.com> | 2000-08-29 18:59:26 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2000-08-29 18:59:26 +0000 |
commit | 4f2aac14aaa7e3b629cabdd862959c411abff15d (patch) | |
tree | 5d36224379a13d55232c16c045ad83537c4c671e | |
parent | 00a2f168e725bb10753885e227e22a8a279c71c6 (diff) | |
download | cygnal-4f2aac14aaa7e3b629cabdd862959c411abff15d.tar.gz cygnal-4f2aac14aaa7e3b629cabdd862959c411abff15d.tar.bz2 cygnal-4f2aac14aaa7e3b629cabdd862959c411abff15d.zip |
* grp.cc (getgroups): fail with EINVAL if array is not large
enough to hold all supplementary group IDs.
-rw-r--r-- | winsup/cygwin/ChangeLog | 5 | ||||
-rw-r--r-- | winsup/cygwin/grp.cc | 15 |
2 files changed, 15 insertions, 5 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 31ff41853..479cbb607 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,8 @@ +2000-08-29 Egor Duda <deo@logos-m.ru> + + * grp.cc (getgroups): fail with EINVAL if array is not large + enough to hold all supplementary group IDs. + Mon Aug 28 22:03:21 2000 Christopher Faylor <cgf@cygnus.com> * signal.cc (_raise): New function. diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc index 85d9aa80d..a4af840f3 100644 --- a/winsup/cygwin/grp.cc +++ b/winsup/cygwin/grp.cc @@ -15,10 +15,12 @@ details. */ #include <grp.h> #include <stdio.h> #include <stdlib.h> +#include <errno.h> #include "thread.h" #include "sync.h" #include "sigproc.h" #include "pinfo.h" +#include "cygerrno.h" /* Read /etc/group only once for better performance. This is done on the first call that needs information from it. */ @@ -248,8 +250,8 @@ getgroups (int gidsetsize, gid_t *grouplist, gid_t gid, const char *username) if (cnt < gidsetsize) grouplist[cnt] = group_buf[i].gr_gid; ++cnt; - if (gidsetsize && cnt >= gidsetsize) - goto out; + if (gidsetsize && cnt > gidsetsize) + goto error; } else if (group_buf[i].gr_mem) for (int gi = 0; group_buf[i].gr_mem[gi]; ++gi) @@ -258,11 +260,14 @@ getgroups (int gidsetsize, gid_t *grouplist, gid_t gid, const char *username) if (cnt < gidsetsize) grouplist[cnt] = group_buf[i].gr_gid; ++cnt; - if (gidsetsize && cnt >= gidsetsize) - goto out; + if (gidsetsize && cnt > gidsetsize) + goto error; } -out: return cnt; + +error: + set_errno ( EINVAL ); + return -1; } extern "C" |