From: Ulrich Drepper Date: Thu, 16 Jun 2011 00:53:22 +0000 (-0400) Subject: Fix handling of initgroups database. X-Git-Tag: glibc-2.15~532 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c41af17eed77f07983dab6f702a6347fcad9a619;p=thirdparty%2Fglibc.git Fix handling of initgroups database. --- diff --git a/ChangeLog b/ChangeLog index ed75109d2b1..f74127808ef 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2011-06-15 Ulrich Drepper + * 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 dad30d5aa4a..48119ff7f2f 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 c35d7f18c21..bc0c6f5a0bd 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 , 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)