57 lines
2.0 KiB
Diff
57 lines
2.0 KiB
Diff
|
From 8f46c6052408a23a77ecf46aa378120c1a4afe37 Mon Sep 17 00:00:00 2001
|
||
|
From: Florian Weimer <fweimer@redhat.com>
|
||
|
Date: Fri, 1 Sep 2017 08:57:28 +0200
|
||
|
Subject: [PATCH 24] getaddrinfo: Properly set errno for NSS function lookup
|
||
|
failure
|
||
|
|
||
|
(cherry picked from commit ad816a5e00ce891a2cea8187638fa0e00f83aaf6)
|
||
|
---
|
||
|
ChangeLog | 5 +++++
|
||
|
sysdeps/posix/getaddrinfo.c | 16 ++++++++++------
|
||
|
2 files changed, 15 insertions(+), 6 deletions(-)
|
||
|
|
||
|
diff --git a/ChangeLog b/ChangeLog
|
||
|
index d53c8fe083..2f959d4c36 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 076e1fa62b..eaf8bafcf4 100644
|
||
|
--- a/sysdeps/posix/getaddrinfo.c
|
||
|
+++ b/sysdeps/posix/getaddrinfo.c
|
||
|
@@ -923,13 +923,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);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|