diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2005-04-06 16:35:52 +0400 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2005-04-06 16:35:52 +0400 |
commit | b62b8d7c8086626f09f699e278d604ac0c8fe9a3 (patch) | |
tree | 84ea779b02926b6a1f9a7c2248201d11c326716a /winsup/cygwin | |
parent | dafef5e249a5ddd5e9a935b802e5e61e4cc8aaa9 (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/ChangeLog | 6 | ||||
-rw-r--r-- | winsup/cygwin/grp.cc | 17 | ||||
-rw-r--r-- | 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 <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); } |