Don't add input group during initgroups_dyn in hesiod

Fixes BZ #15304.

The *initgroups_dyn functions are called with a group argument.  This
group gid is usually skipped while populating the grouplist since the
caller adds that group id in advance.

The hesiod initgroups_dyn implementation however adds the group gid to
the list if it does not already exist.  While it works fine for the
usual initgroups, it breaks nscd since it calls initgroups_dyn with -1
as the gid (to have all groups included).
This commit is contained in:
Siddhesh Poyarekar 2013-03-28 11:45:47 +05:30
parent 1728ab378e
commit 7a86be6e5f
3 changed files with 5 additions and 28 deletions

View File

@ -1,5 +1,9 @@
2013-03-28 Siddhesh Poyarekar <siddhesh@redhat.com>
[BZ #15304]
* hesiod/nss_hesiod/hesiod-grp.c (_nss_hesiod_initgroups_dyn):
Don't add gid passed as argument.
* sysdeps/ieee-754/dbl-64/e_atan2.c: Reformat.
2013-03-27 Joseph Myers <joseph@codesourcery.com>

2
NEWS
View File

@ -12,7 +12,7 @@ Version 2.18
11120, 11561, 12723, 13550, 13889, 13951, 14142, 14176, 14200, 14317,
14327, 14496, 14812, 14920, 14964, 14981, 14982, 14985, 14994, 14996,
15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062, 15078, 15160,
15232, 15234, 15283, 15285, 15287, 15307.
15232, 15234, 15283, 15285, 15287, 15304, 15307.
* Add support for calling C++11 thread_local object destructors on thread
and program exit. This needs compiler support for offloading C++11

View File

@ -191,33 +191,6 @@ _nss_hesiod_initgroups_dyn (const char *user, gid_t group, long int *start,
return errno == ENOENT ? NSS_STATUS_NOTFOUND : NSS_STATUS_UNAVAIL;
}
if (!internal_gid_in_list (groups, group, *start))
{
if (__builtin_expect (*start == *size, 0))
{
/* Need a bigger buffer. */
gid_t *newgroups;
long int newsize;
if (limit > 0 && *size == limit)
/* We reached the maximum. */
goto done;
if (limit <= 0)
newsize = 2 * *size;
else
newsize = MIN (limit, 2 * *size);
newgroups = realloc (groups, newsize * sizeof (*groups));
if (newgroups == NULL)
goto done;
*groupsp = groups = newgroups;
*size = newsize;
}
groups[(*start)++] = group;
}
save_errno = errno;
p = *list;