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:
parent
dafef5e249
commit
b62b8d7c80
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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); }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user