56 lines
1.6 KiB
Diff
56 lines
1.6 KiB
Diff
|
commit 7a86be6e5f18ba99b25d75c555ce56fe1fcea325
|
||
|
Author: Siddhesh Poyarekar <siddhesh@redhat.com>
|
||
|
Date: Thu Mar 28 11:45:47 2013 +0530
|
||
|
|
||
|
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).
|
||
|
|
||
|
diff --git a/hesiod/nss_hesiod/hesiod-grp.c b/hesiod/nss_hesiod/hesiod-grp.c
|
||
|
index c2ae166..b11952f 100644
|
||
|
--- a/hesiod/nss_hesiod/hesiod-grp.c
|
||
|
+++ b/hesiod/nss_hesiod/hesiod-grp.c
|
||
|
@@ -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;
|