* grp.cc (get_groups): Convert to void function.
(initgroups32): Accommodate the aforementioned change. (getgrouplist): Ditto.
This commit is contained in:
parent
ee6ed1db45
commit
ccd40e46d7
|
@ -1,3 +1,9 @@
|
||||||
|
2013-05-14 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* grp.cc (get_groups): Convert to void function.
|
||||||
|
(initgroups32): Accommodate the aforementioned change.
|
||||||
|
(getgrouplist): Ditto.
|
||||||
|
|
||||||
2013-05-14 Corinna Vinschen <corinna@vinschen.de>
|
2013-05-14 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* grp.cc (get_groups): Never return error. Always create a group list,
|
* grp.cc (get_groups): Never return error. Always create a group list,
|
||||||
|
|
|
@ -438,7 +438,7 @@ getgroups (int gidsetsize, __gid16_t *grouplist)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Core functionality of initgroups and getgrouplist. */
|
/* Core functionality of initgroups and getgrouplist. */
|
||||||
static int
|
static void
|
||||||
get_groups (const char *user, gid_t gid, cygsidlist &gsids)
|
get_groups (const char *user, gid_t gid, cygsidlist &gsids)
|
||||||
{
|
{
|
||||||
cygheap->user.deimpersonate ();
|
cygheap->user.deimpersonate ();
|
||||||
|
@ -450,26 +450,21 @@ get_groups (const char *user, gid_t gid, cygsidlist &gsids)
|
||||||
if (grpsid.getfromgr (gr))
|
if (grpsid.getfromgr (gr))
|
||||||
gsids += grpsid;
|
gsids += grpsid;
|
||||||
cygheap->user.reimpersonate ();
|
cygheap->user.reimpersonate ();
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" int
|
extern "C" int
|
||||||
initgroups32 (const char *user, gid_t gid)
|
initgroups32 (const char *user, gid_t gid)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
assert (user != NULL);
|
assert (user != NULL);
|
||||||
cygsidlist tmp_gsids (cygsidlist_auto, 12);
|
cygsidlist tmp_gsids (cygsidlist_auto, 12);
|
||||||
if (!(ret = get_groups (user, gid, tmp_gsids)))
|
get_groups (user, gid, tmp_gsids);
|
||||||
{
|
cygsidlist new_gsids (cygsidlist_alloc, tmp_gsids.count ());
|
||||||
cygsidlist new_gsids (cygsidlist_alloc, tmp_gsids.count ());
|
for (int i = 0; i < tmp_gsids.count (); i++)
|
||||||
for (int i = 0; i < tmp_gsids.count (); i++)
|
new_gsids.sids[i] = tmp_gsids.sids[i];
|
||||||
new_gsids.sids[i] = tmp_gsids.sids[i];
|
new_gsids.count (tmp_gsids.count ());
|
||||||
new_gsids.count (tmp_gsids.count ());
|
cygheap->user.groups.update_supp (new_gsids);
|
||||||
cygheap->user.groups.update_supp (new_gsids);
|
syscall_printf ( "0 = initgroups(%s, %u)", user, gid);
|
||||||
}
|
return 0;
|
||||||
syscall_printf ( "%d = initgroups(%s, %u)", ret, user, gid);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __x86_64__
|
#ifdef __x86_64__
|
||||||
|
@ -485,7 +480,9 @@ initgroups (const char *user, __gid16_t gid)
|
||||||
extern "C" int
|
extern "C" int
|
||||||
getgrouplist (const char *user, gid_t gid, gid_t *groups, int *ngroups)
|
getgrouplist (const char *user, gid_t gid, gid_t *groups, int *ngroups)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
int cnt = 0;
|
||||||
|
struct group *gr;
|
||||||
|
|
||||||
/* Note that it's not defined if groups or ngroups may be NULL!
|
/* Note that it's not defined if groups or ngroups may be NULL!
|
||||||
GLibc does not check the pointers on entry and just uses them.
|
GLibc does not check the pointers on entry and just uses them.
|
||||||
|
@ -496,23 +493,18 @@ getgrouplist (const char *user, gid_t gid, gid_t *groups, int *ngroups)
|
||||||
assert (ngroups != NULL);
|
assert (ngroups != NULL);
|
||||||
|
|
||||||
cygsidlist tmp_gsids (cygsidlist_auto, 12);
|
cygsidlist tmp_gsids (cygsidlist_auto, 12);
|
||||||
if (!(ret = get_groups (user, gid, tmp_gsids)))
|
get_groups (user, gid, tmp_gsids);
|
||||||
{
|
for (int i = 0; i < tmp_gsids.count (); i++)
|
||||||
int cnt = 0;
|
if ((gr = internal_getgrsid (tmp_gsids.sids[i])) != NULL)
|
||||||
for (int i = 0; i < tmp_gsids.count (); i++)
|
{
|
||||||
{
|
if (groups && cnt < *ngroups)
|
||||||
struct group *gr = internal_getgrsid (tmp_gsids.sids[i]);
|
groups[cnt] = gr->gr_gid;
|
||||||
if (gr)
|
++cnt;
|
||||||
{
|
}
|
||||||
if (groups && cnt < *ngroups)
|
if (cnt > *ngroups)
|
||||||
groups[cnt] = gr->gr_gid;
|
ret = -1;
|
||||||
++cnt;
|
*ngroups = cnt;
|
||||||
}
|
|
||||||
}
|
|
||||||
if (cnt > *ngroups)
|
|
||||||
ret = -1;
|
|
||||||
*ngroups = cnt;
|
|
||||||
}
|
|
||||||
syscall_printf ( "%d = getgrouplist(%s, %u, %p, %d)",
|
syscall_printf ( "%d = getgrouplist(%s, %u, %p, %d)",
|
||||||
ret, user, gid, groups, *ngroups);
|
ret, user, gid, groups, *ngroups);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -12,3 +12,4 @@ What's new:
|
||||||
Bug fixes:
|
Bug fixes:
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
- getgrouplist
|
||||||
|
|
Loading…
Reference in New Issue