diff options
author | Ulrich Drepper <drepper@redhat.com> | 2010-11-22 11:11:24 -0500 |
---|---|---|
committer | Petr Baudis <pasky@suse.cz> | 2010-11-30 03:24:31 +0100 |
commit | 491e94705bce68a32ce9ddbf4eefd17c5814c1fb (patch) | |
tree | 0b9ee09d4f0ee35ec33e8c71dfdb88a1abb5b5cd | |
parent | 5c26c0f7f9f5a953b21bd38dab97cbb9a59513af (diff) | |
download | glibc-491e94705bce68a32ce9ddbf4eefd17c5814c1fb.tar.gz glibc-491e94705bce68a32ce9ddbf4eefd17c5814c1fb.tar.xz glibc-491e94705bce68a32ce9ddbf4eefd17c5814c1fb.zip |
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-- | ChangeLog | 6 | ||||
-rw-r--r-- | nis/nss_compat/compat-initgroups.c | 19 |
2 files changed, 17 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog index 24259f75a7..54f9d041b3 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 07a3b9282c..de8d95c7d1 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); } |