aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2011-06-15 20:53:22 -0400
committerUlrich Drepper <drepper@gmail.com>2011-06-15 21:06:19 -0400
commitc41af17eed77f07983dab6f702a6347fcad9a619 (patch)
tree1d6ec2a294dcca7d9f54e26231b89752d6d44cd2
parenta9e836b0406c259979fbb31eb6650d33c2bbefbc (diff)
downloadglibc-c41af17eed77f07983dab6f702a6347fcad9a619.tar
glibc-c41af17eed77f07983dab6f702a6347fcad9a619.tar.gz
glibc-c41af17eed77f07983dab6f702a6347fcad9a619.tar.bz2
glibc-c41af17eed77f07983dab6f702a6347fcad9a619.zip
Fix handling of initgroups database.
-rw-r--r--ChangeLog5
-rw-r--r--grp/initgroups.c19
-rw-r--r--nss/databases.def3
3 files changed, 19 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index ed75109d2b..f74127808e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
2011-06-15 Ulrich Drepper <drepper@gmail.com>
+ * grp/initgroups.c (__nss_initgroups_database): Renamed and exported.
+ (internal_getgrouplist): Adjust to name change.
+ Update use_initgroups_entry if this is not the first call.
+ * nss/databases.def: Add initgroups entry.
+
* nss/makedb.c (compute_tables): Check result of multiple hash table
sizes to minimize maximum chain length.
diff --git a/grp/initgroups.c b/grp/initgroups.c
index dad30d5aa4..48119ff7f2 100644
--- a/grp/initgroups.c
+++ b/grp/initgroups.c
@@ -44,7 +44,7 @@ extern int __nss_group_lookup (service_user **nip, const char *name,
extern void *__nss_lookup_function (service_user *ni, const char *fct_name);
extern service_user *__nss_group_database attribute_hidden;
-static service_user *initgroups_database;
+service_user *__nss_initgroups_database;
static bool use_initgroups_entry;
@@ -80,26 +80,31 @@ internal_getgrouplist (const char *user, gid_t group, long int *size,
/* Start is one, because we have the first group as parameter. */
long int start = 1;
- if (initgroups_database == NULL)
+ if (__nss_initgroups_database == NULL)
{
no_more = __nss_database_lookup ("initgroups", NULL, "",
- &initgroups_database);
- if (no_more == 0 && initgroups_database == NULL)
+ &__nss_initgroups_database);
+ if (no_more == 0 && __nss_initgroups_database == NULL)
{
if (__nss_group_database == NULL)
no_more = __nss_database_lookup ("group", NULL, "compat files",
&__nss_group_database);
- initgroups_database = __nss_group_database;
+ __nss_initgroups_database = __nss_group_database;
}
- else if (initgroups_database != NULL)
+ else if (__nss_initgroups_database != NULL)
{
assert (no_more == 0);
use_initgroups_entry = true;
}
}
+ else
+ /* __nss_initgroups_database might have been set through
+ __nss_configure_lookup in which case use_initgroups_entry was
+ not set here. */
+ use_initgroups_entry = __nss_initgroups_database != __nss_group_database;
- service_user *nip = initgroups_database;
+ service_user *nip = __nss_initgroups_database;
while (! no_more)
{
long int prev_start = start;
diff --git a/nss/databases.def b/nss/databases.def
index c35d7f18c2..bc0c6f5a0b 100644
--- a/nss/databases.def
+++ b/nss/databases.def
@@ -1,5 +1,5 @@
/* List of all databases defined for the NSS in GNU C Library.
- Copyright (C) 1996, 1997, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 2005, 2011 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
@@ -25,6 +25,7 @@ DEFINE_DATABASE (aliases)
DEFINE_DATABASE (ethers)
DEFINE_DATABASE (group)
DEFINE_DATABASE (hosts)
+DEFINE_DATABASE (initgroups)
DEFINE_DATABASE (netgroup)
DEFINE_DATABASE (networks)
DEFINE_DATABASE (passwd)