aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2010-11-22 11:11:24 -0500
committerAndreas Schwab <schwab@redhat.com>2010-12-01 15:35:20 +0100
commitd1d5508011bfbd594f4d1c61d20b0ab9fb1bdc1d (patch)
treef324d85726dfccbeb68070839ac9791fc8260235
parent24990266ba20fcff9fe4f08646350fdece96f27a (diff)
downloadglibc-d1d5508011bfbd594f4d1c61d20b0ab9fb1bdc1d.zip
glibc-d1d5508011bfbd594f4d1c61d20b0ab9fb1bdc1d.tar.gz
glibc-d1d5508011bfbd594f4d1c61d20b0ab9fb1bdc1d.tar.bz2
Fix multiple nss_compat initgroups() bugs
Compat initgroups() is completely broken; the code will always set skip_initgroups_dyn to true, so initgroups() will never be actually called, but due to the nature of the code, setgrent() won't be called either - thus, subsequent invocations of initgroups() will not return the NIS group list anymore. This is a simple patch that makes sure skip_initgroups_dyn is set only in case initgroups is not available; it also attempts to handle the unavailability of other NSS interfaces better. Conflicts: ChangeLog (cherry picked from commit 3056dcdb783a177158a5617657d1a33f872358d6)
-rw-r--r--ChangeLog6
-rw-r--r--nis/nss_compat/compat-initgroups.c19
2 files changed, 17 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 45fc5eb..de688e3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2010-05-31 Petr Baudis <pasky@suse.cz>
+
+ [BZ #10085]
+ * nis/nss_compat/compat-initgroups.c (internal_getgrent_r): Fix
+ initialization of skip_initgroups_dyn.
+
2010-09-27 Andreas Schwab <schwab@redhat.com>
[BZ #11611]
diff --git a/nis/nss_compat/compat-initgroups.c b/nis/nss_compat/compat-initgroups.c
index 07a3b92..de8d95c 100644
--- a/nis/nss_compat/compat-initgroups.c
+++ b/nis/nss_compat/compat-initgroups.c
@@ -474,18 +474,21 @@ internal_getgrent_r (ent_t *ent, char *buffer, size_t buflen, const char *user,
/* If the selected module does not support getgrent_r or
initgroups_dyn, abort. We cannot find the needed group
entries. */
- if (nss_getgrent_r == NULL && nss_initgroups_dyn == NULL)
+ if (nss_initgroups_dyn == NULL || nss_getgrgid_r == NULL)
+ {
+ if (nss_setgrent != NULL)
+ {
+ nss_setgrent (1);
+ ent->need_endgrent = true;
+ }
+ ent->skip_initgroups_dyn = true;
+ }
+
+ if (ent->skip_initgroups_dyn && nss_getgrent_r == NULL)
return NSS_STATUS_UNAVAIL;
ent->files = false;
- if (nss_initgroups_dyn == NULL && nss_setgrent != NULL)
- {
- nss_setgrent (1);
- ent->need_endgrent = true;
- }
- ent->skip_initgroups_dyn = true;
-
return getgrent_next_nss (ent, buffer, buflen, user, group,
start, size, groupsp, limit, errnop);
}