diff options
-rw-r--r-- | nscd/Makefile | 1 | ||||
-rw-r--r-- | nscd/nscd-client.h | 4 | ||||
-rw-r--r-- | nscd/nscd_getai.c | 1 | ||||
-rw-r--r-- | nscd/nscd_helper.c | 4 | ||||
-rw-r--r-- | nscd/nscd_proto.h | 5 | ||||
-rw-r--r-- | nss/getXXbyYY_r.c | 3 | ||||
-rw-r--r-- | sysdeps/posix/getaddrinfo.c | 120 |
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 |