summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDJ Delorie <dj@redhat.com>2000-08-29 18:59:26 +0000
committerDJ Delorie <dj@redhat.com>2000-08-29 18:59:26 +0000
commit4f2aac14aaa7e3b629cabdd862959c411abff15d (patch)
tree5d36224379a13d55232c16c045ad83537c4c671e
parent00a2f168e725bb10753885e227e22a8a279c71c6 (diff)
downloadcygnal-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/ChangeLog5
-rw-r--r--winsup/cygwin/grp.cc15
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"