From: Florian Weimer Date: Fri, 1 Sep 2017 06:57:28 +0000 (+0200) Subject: getaddrinfo: Properly set errno for NSS function lookup failure X-Git-Tag: glibc-2.27~1003 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ad816a5e00ce891a2cea8187638fa0e00f83aaf6;p=thirdparty%2Fglibc.git getaddrinfo: Properly set errno for NSS function lookup failure --- diff --git a/ChangeLog b/ChangeLog index 4d8c6f67445..4229a83b9c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2017-09-01 Florian Weimer + + * sysdeps/posix/getaddrinfo.c (gaih_inet): Make reporting of NSS + function lookup failures more reliable. + 2017-09-01 Florian Weimer * sysdeps/posix/getaddrinfo.c (gethosts): Use h_errno directly. diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c index 4edd5e2a1b4..95b514873d7 100644 --- a/sysdeps/posix/getaddrinfo.c +++ b/sysdeps/posix/getaddrinfo.c @@ -922,13 +922,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); } }