diff options
author | Ulrich Drepper <drepper@redhat.com> | 2010-04-05 12:21:20 -0700 |
---|---|---|
committer | Petr Baudis <pasky@ucw.cz> | 2010-05-12 03:21:13 +0200 |
commit | 52ade99fe57673eccffbcd71dea61692c424930d (patch) | |
tree | fdab58e6f98747ce4847ebb0182af85fa70649c7 | |
parent | fbca690a79f9b0232acc0e1d8504d62243bcdbb0 (diff) | |
download | glibc-52ade99fe57673eccffbcd71dea61692c424930d.tar.gz glibc-52ade99fe57673eccffbcd71dea61692c424930d.tar.xz glibc-52ade99fe57673eccffbcd71dea61692c424930d.zip |
Handle DNS timeouts in old-style lookkup code.
(cherry picked from commit 4535680d03d15dc9ce19d97b9d242a10941d5016)
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | resolv/nss_dns/dns-host.c | 18 |
2 files changed, 16 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog index 26c4e2f245..6df5c047f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2010-04-05 Ulrich Drepper <drepper@redhat.com> + [BZ #11010] + * resolv/nss_dns/dns-host.c (_nss_dns_gethostbyname3_r): Handle + timeouts from servers. + [BZ #11149] * elf/ldconfig.c (main): Respect chroot setting when looking for the aux cache. diff --git a/resolv/nss_dns/dns-host.c b/resolv/nss_dns/dns-host.c index 818a40a898..e0c4978c3b 100644 --- a/resolv/nss_dns/dns-host.c +++ b/resolv/nss_dns/dns-host.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996-2004, 2007, 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1996-2004, 2007-2009, 2010 Free Software Foundation, Inc. This file is part of the GNU C Library. Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996. @@ -198,21 +198,27 @@ _nss_dns_gethostbyname3_r (const char *name, int af, struct hostent *result, 1024, &host_buffer.ptr, NULL, NULL, NULL); if (n < 0) { - if (errno == ESRCH) + switch (errno) { + case ESRCH: status = NSS_STATUS_TRYAGAIN; h_errno = TRY_AGAIN; + break; + case ECONNREFUSED: + case ETIMEDOUT: + status = NSS_STATUS_UNAVAIL; + break; + default: + status = NSS_STATUS_NOTFOUND; + break; } - else - status = (errno == ECONNREFUSED - ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND); *h_errnop = h_errno; if (h_errno == TRY_AGAIN) *errnop = EAGAIN; else __set_errno (olderr); - /* If we are looking for a IPv6 address and mapping is enabled + /* If we are looking for an IPv6 address and mapping is enabled by having the RES_USE_INET6 bit in _res.options set, we try another lookup. */ if (af == AF_INET6 && (_res.options & RES_USE_INET6)) |