summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--nscd/Makefile1
-rw-r--r--nscd/nscd-client.h4
-rw-r--r--nscd/nscd_getai.c1
-rw-r--r--nscd/nscd_helper.c4
-rw-r--r--nscd/nscd_proto.h5
-rw-r--r--nss/getXXbyYY_r.c3
-rw-r--r--sysdeps/posix/getaddrinfo.c120
7 files changed, 73 insertions, 65 deletions
diff --git a/nscd/Makefile b/nscd/Makefile
index a6a08a3ab8..3e6a8b5182 100644
--- a/nscd/Makefile
+++ b/nscd/Makefile
@@ -82,6 +82,7 @@ CFLAGS-xmalloc.c = -fpie
CFLAGS-xstrdup.c = -fpie
CFLAGS-mem.c = -fpie
CFLAGS-nscd_setup_thread.c = -fpie
+CFLAGS-aicache.c = -fpie
$(objpfx)nscd: $(addprefix $(objpfx),$(nscd-modules:=.o))
$(LINK.o) -pie -Wl,-O1 \
diff --git a/nscd/nscd-client.h b/nscd/nscd-client.h
index 1a0dd732db..4451349278 100644
--- a/nscd/nscd-client.h
+++ b/nscd/nscd-client.h
@@ -294,8 +294,4 @@ extern const struct datahead *__nscd_cache_search (request_type type,
size_t keylen,
const struct mapped_database *mapped);
-/* Look up in addrinfo cache. */
-extern int __nscd_getai (const char *key, struct nscd_ai_result **result,
- int *h_errnop);
-
#endif /* nscd.h */
diff --git a/nscd/nscd_getai.c b/nscd/nscd_getai.c
index 453f459425..627fe8cf9d 100644
--- a/nscd/nscd_getai.c
+++ b/nscd/nscd_getai.c
@@ -27,6 +27,7 @@
#include <not-cancel.h>
#include "nscd-client.h"
+#include "nscd_proto.h"
/* Define in nscd_gethst_r.c. */
diff --git a/nscd/nscd_helper.c b/nscd/nscd_helper.c
index e40500c83c..ae8dd6c91f 100644
--- a/nscd/nscd_helper.c
+++ b/nscd/nscd_helper.c
@@ -72,7 +72,7 @@ void
__nscd_unmap (struct mapped_database *mapped)
{
assert (mapped->counter == 0);
- munmap ((void *) mapped->head, mapped->mapsize);
+ __munmap ((void *) mapped->head, mapped->mapsize);
free (mapped);
}
@@ -180,7 +180,7 @@ get_mapping (request_type type, const char *key,
if (newp == NULL)
{
/* Ugh, after all we went through the memory allocation failed. */
- munmap (result, size);
+ __munmap (result, size);
goto out_close;
}
diff --git a/nscd/nscd_proto.h b/nscd/nscd_proto.h
index 0c3cc73296..b0ee03cd84 100644
--- a/nscd/nscd_proto.h
+++ b/nscd/nscd_proto.h
@@ -24,6 +24,9 @@
#include <netdb.h>
#include <pwd.h>
+/* Interval in which we transfer retry to contact the NSCD. */
+#define NSS_NSCD_RETRY 100
+
/* Variables for communication between NSCD handler functions and NSS. */
extern int __nss_not_use_nscd_passwd attribute_hidden;
extern int __nss_not_use_nscd_group attribute_hidden;
@@ -53,5 +56,7 @@ extern int __nscd_gethostbyaddr_r (const void *addr, socklen_t len, int type,
struct hostent *resultbuf,
char *buffer, size_t buflen,
struct hostent **result, int *h_errnop);
+extern int __nscd_getai (const char *key, struct nscd_ai_result **result,
+ int *h_errnop);
#endif /* _NSCD_PROTO_H */
diff --git a/nss/getXXbyYY_r.c b/nss/getXXbyYY_r.c
index 9e425ce55e..34c305f3b2 100644
--- a/nss/getXXbyYY_r.c
+++ b/nss/getXXbyYY_r.c
@@ -114,9 +114,6 @@ extern int DB_LOOKUP_FCT (service_user **nip, const char *name, void **fctp)
internal_function;
libc_hidden_proto (DB_LOOKUP_FCT)
-/* Interval in which we transfer retry to contact the NSCD. */
-#define NSS_NSCD_RETRY 100
-
int
INTERNAL (REENTRANT_NAME) (ADD_PARAMS, LOOKUP_TYPE *resbuf, char *buffer,
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c
index c9553849fd..9bf2537235 100644
--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -55,6 +55,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <nsswitch.h>
#include <not-cancel.h>
#include <nscd/nscd-client.h>
+#include <nscd/nscd_proto.h>
#ifdef HAVE_LIBIDN
extern int __idna_to_ascii_lz (const char *input, char **output, int flags);
@@ -672,69 +673,76 @@ gaih_inet (const char *name, const struct gaih_service *service,
}
#ifdef USE_NSCD
- /* Try to use nscd. */
- struct nscd_ai_result *air = NULL;
- int herrno;
- int err = __nscd_getai (name, &air, &herrno);
- if (air != NULL)
- {
- /* Transform into gaih_addrtuple list. */
- bool added_canon = (req->ai_flags & AI_CANONNAME) == 0;
- char *addrs = air->addrs;
+ if (__nss_not_use_nscd_hosts > 0
+ && ++__nss_not_use_nscd_hosts > NSS_NSCD_RETRY)
+ __nss_not_use_nscd_hosts = 0;
- for (int i = 0; i < air->naddrs; ++i)
+ if (!__nss_not_use_nscd_hosts)
+ {
+ /* Try to use nscd. */
+ struct nscd_ai_result *air = NULL;
+ int herrno;
+ int err = __nscd_getai (name, &air, &herrno);
+ if (air != NULL)
{
- socklen_t size = (air->family[i] == AF_INET
- ? INADDRSZ : IN6ADDRSZ);
- if (*pat == NULL)
- {
- *pat = __alloca (sizeof (struct gaih_addrtuple));
- (*pat)->scopeid = 0;
- }
- uint32_t *pataddr = (*pat)->addr;
- (*pat)->next = NULL;
- if (added_canon || air->canon == NULL)
- (*pat)->name = NULL;
- else
- canon = (*pat)->name = strdupa (air->canon);
+ /* Transform into gaih_addrtuple list. */
+ bool added_canon = (req->ai_flags & AI_CANONNAME) == 0;
+ char *addrs = air->addrs;
- if (air->family[i] == AF_INET
- && req->ai_family == AF_INET6
- && (req->ai_flags & AI_V4MAPPED))
+ for (int i = 0; i < air->naddrs; ++i)
{
- (*pat)->family = AF_INET6;
- pataddr[3] = *(uint32_t *) addrs;
- pataddr[2] = htonl (0xffff);
- pataddr[1] = 0;
- pataddr[0] = 0;
- pat = &((*pat)->next);
- added_canon = true;
- }
- else if (req->ai_family == AF_UNSPEC
- || air->family[i] == req->ai_family)
- {
- (*pat)->family = air->family[i];
- memcpy (pataddr, addrs, size);
- pat = &((*pat)->next);
- added_canon = true;
- if (air->family[i] == AF_INET6)
- got_ipv6 = true;
+ socklen_t size = (air->family[i] == AF_INET
+ ? INADDRSZ : IN6ADDRSZ);
+ if (*pat == NULL)
+ {
+ *pat = __alloca (sizeof (struct gaih_addrtuple));
+ (*pat)->scopeid = 0;
+ }
+ uint32_t *pataddr = (*pat)->addr;
+ (*pat)->next = NULL;
+ if (added_canon || air->canon == NULL)
+ (*pat)->name = NULL;
+ else
+ canon = (*pat)->name = strdupa (air->canon);
+
+ if (air->family[i] == AF_INET
+ && req->ai_family == AF_INET6
+ && (req->ai_flags & AI_V4MAPPED))
+ {
+ (*pat)->family = AF_INET6;
+ pataddr[3] = *(uint32_t *) addrs;
+ pataddr[2] = htonl (0xffff);
+ pataddr[1] = 0;
+ pataddr[0] = 0;
+ pat = &((*pat)->next);
+ added_canon = true;
+ }
+ else if (req->ai_family == AF_UNSPEC
+ || air->family[i] == req->ai_family)
+ {
+ (*pat)->family = air->family[i];
+ memcpy (pataddr, addrs, size);
+ pat = &((*pat)->next);
+ added_canon = true;
+ if (air->family[i] == AF_INET6)
+ got_ipv6 = true;
+ }
+ addrs += size;
}
- addrs += size;
- }
- if (at->family == AF_UNSPEC)
- return (GAIH_OKIFUNSPEC | -EAI_NONAME);
+ if (at->family == AF_UNSPEC)
+ return (GAIH_OKIFUNSPEC | -EAI_NONAME);
- goto process_list;
- }
- else if (err != 0)
- {
- if (herrno == NETDB_INTERNAL && errno == ENOMEM)
- return -EAI_MEMORY;
- if (herrno == TRY_AGAIN)
- return -EAI_AGAIN;
- return -EAI_SYSTEM;
+ goto process_list;
+ }
+ else if (err != 0 && __nss_not_use_nscd_hosts == 0)
+ {
+ if (herrno == NETDB_INTERNAL && errno == ENOMEM)
+ return -EAI_MEMORY;
+ if (herrno == TRY_AGAIN)
+ return -EAI_AGAIN;
+ return -EAI_SYSTEM;
+ }
}
#endif