aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Weimer <fweimer@redhat.com>2017-09-01 08:57:28 +0200
committerFlorian Weimer <fweimer@redhat.com>2017-09-01 08:57:28 +0200
commitad816a5e00ce891a2cea8187638fa0e00f83aaf6 (patch)
tree4985fd02781cfe3ff533f619afd87bed6d6e9f70
parent53250a21b81474ef4e78090a4a9a63d8471e1091 (diff)
downloadglibc-ad816a5e00ce891a2cea8187638fa0e00f83aaf6.tar
glibc-ad816a5e00ce891a2cea8187638fa0e00f83aaf6.tar.gz
glibc-ad816a5e00ce891a2cea8187638fa0e00f83aaf6.tar.bz2
glibc-ad816a5e00ce891a2cea8187638fa0e00f83aaf6.zip
getaddrinfo: Properly set errno for NSS function lookup failure
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/posix/getaddrinfo.c16
2 files changed, 15 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 4d8c6f6744..4229a83b9c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
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.
(getcanonname): Likewise.
(gaih_inet): Likewise.
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index 4edd5e2a1b..95b514873d 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);
}
}