From b62b8d7c8086626f09f699e278d604ac0c8fe9a3 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 6 Apr 2005 12:35:52 +0000 Subject: [PATCH] * 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. --- winsup/cygwin/ChangeLog | 6 ++++++ winsup/cygwin/grp.cc | 17 +++++++---------- winsup/cygwin/security.h | 3 ++- 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 + + * 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 * 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); }