4
0
mirror of git://sourceware.org/git/newlib-cygwin.git synced 2025-03-02 13:05:42 +08:00

* 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.
This commit is contained in:
Corinna Vinschen 2005-04-06 12:35:52 +00:00
parent dafef5e249
commit b62b8d7c80
3 changed files with 15 additions and 11 deletions

View File

@ -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> 2005-04-06 Christopher Faylor <cgf@timesys.com>
* net.cc (cygwin_getservbyname): Return (possibly NULL) return value of * net.cc (cygwin_getservbyname): Return (possibly NULL) return value of

View File

@ -448,10 +448,11 @@ getgroups (int gidsetsize, __gid16_t *grouplist)
} }
extern "C" int extern "C" int
initgroups32 (const char *, __gid32_t) initgroups32 (const char *name, __gid32_t gid)
{ {
if (wincap.has_security ()) if (wincap.has_security ())
cygheap->user.groups.clear_supp (); cygheap->user.groups.clear_supp ();
syscall_printf ( "0 = initgroups (%s, %u)", name, gid);
return 0; return 0;
} }
@ -465,6 +466,7 @@ initgroups (const char * name, __gid16_t gid)
extern "C" int extern "C" int
setgroups32 (int ngroups, const __gid32_t *grouplist) setgroups32 (int ngroups, const __gid32_t *grouplist)
{ {
syscall_printf ("setgroups32 (%d)", ngroups);
if (ngroups < 0 || (ngroups > 0 && !grouplist)) if (ngroups < 0 || (ngroups > 0 && !grouplist))
{ {
set_errno (EINVAL); set_errno (EINVAL);
@ -482,18 +484,13 @@ setgroups32 (int ngroups, const __gid32_t *grouplist)
for (int gidx = 0; gidx < ngroups; ++gidx) for (int gidx = 0; gidx < ngroups; ++gidx)
{ {
for (int gidy = 0; gidy < gidx; gidy++) if ((gr = internal_getgrgid (grouplist[gidx]))
if (grouplist[gidy] == grouplist[gidx]) && gsids.addfromgr (gr))
goto found; /* Duplicate */ continue;
if ((gr = internal_getgrgid (grouplist[gidx])) &&
gsids.addfromgr (gr))
goto found;
debug_printf ("No sid found for gid %d", grouplist[gidx]); debug_printf ("No sid found for gid %d", grouplist[gidx]);
gsids.free_sids (); gsids.free_sids ();
set_errno (EINVAL); set_errno (EINVAL);
return -1; return -1;
found:
continue;
} }
cygheap->user.groups.update_supp (gsids); cygheap->user.groups.update_supp (gsids);
return 0; return 0;

View File

@ -148,7 +148,8 @@ public:
BOOL add (const char *sidstr) BOOL add (const char *sidstr)
{ cygsid nsi (sidstr); return add (nsi); } { cygsid nsi (sidstr); return add (nsi); }
BOOL addfromgr (struct __group32 *gr) /* Only with alloc */ 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+= (cygsid &si) { return add (si); }
BOOL operator+= (const char *sidstr) { return add (sidstr); } BOOL operator+= (const char *sidstr) { return add (sidstr); }