diff options
author | DJ Delorie <dj@redhat.com> | 2020-12-09 21:46:30 -0500 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2020-12-14 12:19:43 -0500 |
commit | d2e929a907914e233d001d1dd5e3143e84fa69e0 (patch) | |
tree | e0fc726fa628727fee23a86a6053f9107502c84b /nss | |
parent | 2ee7711bdd7de9dd30073b223ce29d5cd50320f6 (diff) | |
download | glibc-d2e929a907914e233d001d1dd5e3143e84fa69e0.tar.gz glibc-d2e929a907914e233d001d1dd5e3143e84fa69e0.tar.xz glibc-d2e929a907914e233d001d1dd5e3143e84fa69e0.zip |
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 See also https://bugzilla.redhat.com/show_bug.cgi?id=1906066 Reviewed-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
Diffstat (limited to 'nss')
-rw-r--r-- | nss/nss_database.c | 3 | ||||
-rw-r--r-- | nss/nsswitch.c | 5 |
2 files changed, 6 insertions, 2 deletions
diff --git a/nss/nss_database.c b/nss/nss_database.c index 6ff537152f..6a969ecad8 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..5b46d06c6a 100644 --- a/nss/nsswitch.c +++ b/nss/nsswitch.c @@ -81,7 +81,10 @@ __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 *NI is NULL, the database was not mentioned in nsswitch.conf. + If *NI is not NULL, but *NI->module is NULL, the database was in + nsswitch.conf but listed no actions. We test for the former. */ + if (__nss_database_get (database_id, ni) && *ni != NULL) { /* Success. */ return 0; |