Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2005-04-06 16:35:52 +0400
committerCorinna Vinschen <corinna@vinschen.de>2005-04-06 16:35:52 +0400
commitb62b8d7c8086626f09f699e278d604ac0c8fe9a3 (patch)
tree84ea779b02926b6a1f9a7c2248201d11c326716a /winsup/cygwin
parentdafef5e249a5ddd5e9a935b802e5e61e4cc8aaa9 (diff)
* security.h (cygsidlist::addfromgr): Avoid duplicate entries.
* grp.cc (initgrousp): Add syscall_printf. (setgroups): Add syscall_printf and make sure sids are added only once.
Diffstat (limited to 'winsup/cygwin')
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/grp.cc17
-rw-r--r--winsup/cygwin/security.h3
3 files changed, 15 insertions, 11 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index f21b91869..bc1069a08 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2005-04-06 Pierre Humblet <pierre.humblet@ieee.org>
+
+ * security.h (cygsidlist::addfromgr): Avoid duplicate entries.
+ * grp.cc (initgrousp): Add syscall_printf.
+ (setgroups): Add syscall_printf and make sure sids are added only once.
+
2005-04-06 Christopher Faylor <cgf@timesys.com>
* net.cc (cygwin_getservbyname): Return (possibly NULL) return value of
diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc
index e79383999..ae3c27ad2 100644
--- a/winsup/cygwin/grp.cc
+++ b/winsup/cygwin/grp.cc
@@ -448,15 +448,16 @@ getgroups (int gidsetsize, __gid16_t *grouplist)
}
extern "C" int
-initgroups32 (const char *, __gid32_t)
+initgroups32 (const char *name, __gid32_t gid)
{
if (wincap.has_security ())
cygheap->user.groups.clear_supp ();
+ syscall_printf ( "0 = initgroups (%s, %u)", name, gid);
return 0;
}
extern "C" int
-initgroups (const char * name, __gid16_t gid)
+initgroups (const char *name, __gid16_t gid)
{
return initgroups32 (name, gid16togid32(gid));
}
@@ -465,6 +466,7 @@ initgroups (const char * name, __gid16_t gid)
extern "C" int
setgroups32 (int ngroups, const __gid32_t *grouplist)
{
+ syscall_printf ("setgroups32 (%d)", ngroups);
if (ngroups < 0 || (ngroups > 0 && !grouplist))
{
set_errno (EINVAL);
@@ -482,18 +484,13 @@ setgroups32 (int ngroups, const __gid32_t *grouplist)
for (int gidx = 0; gidx < ngroups; ++gidx)
{
- for (int gidy = 0; gidy < gidx; gidy++)
- if (grouplist[gidy] == grouplist[gidx])
- goto found; /* Duplicate */
- if ((gr = internal_getgrgid (grouplist[gidx])) &&
- gsids.addfromgr (gr))
- goto found;
+ if ((gr = internal_getgrgid (grouplist[gidx]))
+ && gsids.addfromgr (gr))
+ continue;
debug_printf ("No sid found for gid %d", grouplist[gidx]);
gsids.free_sids ();
set_errno (EINVAL);
return -1;
- found:
- continue;
}
cygheap->user.groups.update_supp (gsids);
return 0;
diff --git a/winsup/cygwin/security.h b/winsup/cygwin/security.h
index 0ee8e7134..1c95d30b3 100644
--- a/winsup/cygwin/security.h
+++ b/winsup/cygwin/security.h
@@ -148,7 +148,8 @@ public:
BOOL add (const char *sidstr)
{ cygsid nsi (sidstr); return add (nsi); }
BOOL addfromgr (struct __group32 *gr) /* Only with alloc */
- { return sids[count++].getfromgr (gr); }
+ { return sids[count].getfromgr (gr)
+ && (contains (sids[count]) || ++count); }
BOOL operator+= (cygsid &si) { return add (si); }
BOOL operator+= (const char *sidstr) { return add (sidstr); }