From d74a39158ab4aafa8af874e996bf5ddbde593bc0 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Wed, 9 Dec 2020 21:46:30 -0500 Subject: nsswitch: handle missing actions properly Some internal functions need to know if a database has a nonzero list of actions; success getting the database does not guarantee that. Add checks for such as needed. Skip the ":" in each nsswitch.conf line so as not to add a dummy action libnss_:.so diff --git a/grp/initgroups.c b/grp/initgroups.c index a60ca1c395..a0a836d862 100644 --- a/grp/initgroups.c +++ b/grp/initgroups.c @@ -72,11 +72,13 @@ internal_getgrouplist (const char *user, gid_t group, long int *size, nss_action_list nip; - if (__nss_database_get (nss_database_initgroups, &nip)) + if (__nss_database_get (nss_database_initgroups, &nip) + && nip != NULL) { use_initgroups_entry = true; } - else if (__nss_database_get (nss_database_group, &nip)) + else if (__nss_database_get (nss_database_group, &nip) + && nip != NULL) { use_initgroups_entry = false; } diff --git a/nss/nss_database.c b/nss/nss_database.c index e8c307d1f3..a036e95fbf 100644 --- a/nss/nss_database.c +++ b/nss/nss_database.c @@ -212,7 +212,8 @@ process_line (struct nss_database_data *data, char *line) if (line[0] == '\0' || name == line) /* Syntax error. Skip this line. */ return true; - *line++ = '\0'; + while (line[0] != '\0' && (isspace (line[0]) || line[0] == ':')) + *line++ = '\0'; int db = name_to_database_index (name); if (db < 0) diff --git a/nss/nsswitch.c b/nss/nsswitch.c index 40109c744d..921062e04f 100644 --- a/nss/nsswitch.c +++ b/nss/nsswitch.c @@ -81,7 +81,7 @@ __nss_database_lookup2 (const char *database, const char *alternate_name, if (database_names[database_id] == NULL) return -1; - if (__nss_database_get (database_id, ni)) + if (__nss_database_get (database_id, ni) && *ni) { /* Success. */ return 0;