]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
getaddrinfo: Properly set errno for NSS function lookup failure
authorFlorian Weimer <fweimer@redhat.com>
Fri, 1 Sep 2017 06:57:28 +0000 (08:57 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Thu, 4 Jan 2018 11:00:14 +0000 (12:00 +0100)
(cherry picked from commit ad816a5e00ce891a2cea8187638fa0e00f83aaf6)

ChangeLog
sysdeps/posix/getaddrinfo.c

index 1bb6d4c005d3b47ef33a838fd281accefb863eef..0d09261cac2f776288ae23b914664eb8b156c86e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2017-09-01  Florian Weimer  <fweimer@redhat.com>
+
+       * sysdeps/posix/getaddrinfo.c (gaih_inet): Make reporting of NSS
+       function lookup failures more reliable.
+
 2017-09-01  Florian Weimer  <fweimer@redhat.com>
 
        * sysdeps/posix/getaddrinfo.c (gethosts): Use h_errno directly.
index 798464875e74e3f23d73e94671dfe5f0ea6be270..65394a37d6d28b6a475a500d0fa917b6c93b77e7 100644 (file)
@@ -919,13 +919,17 @@ gaih_inet (const char *name, const struct gaih_service *service,
                    }
                  else
                    {
+                     /* Could not locate any of the lookup functions.
+                        The NSS lookup code does not consistently set
+                        errno, so we need to supply our own error
+                        code here.  The root cause could either be a
+                        resource allocation failure, or a missing
+                        service function in the DSO (so it should not
+                        be listed in /etc/nsswitch.conf).  Assume the
+                        former, and return EBUSY.  */
                      status = NSS_STATUS_UNAVAIL;
-                     /* Could not load any of the lookup functions.  Indicate
-                        an internal error if the failure was due to a system
-                        error other than the file not being found.  We use the
-                        errno from the last failed callback.  */
-                     if (errno != 0 && errno != ENOENT)
-                       __set_h_errno (NETDB_INTERNAL);
+                    __set_h_errno (NETDB_INTERNAL);
+                    __set_errno (EBUSY);
                    }
                }