]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Handle DNS timeouts in old-style lookkup code.
authorUlrich Drepper <drepper@redhat.com>
Mon, 5 Apr 2010 19:21:20 +0000 (12:21 -0700)
committerPetr Baudis <pasky@ucw.cz>
Wed, 12 May 2010 01:21:13 +0000 (03:21 +0200)
(cherry picked from commit 4535680d03d15dc9ce19d97b9d242a10941d5016)

ChangeLog
resolv/nss_dns/dns-host.c

index 26c4e2f245ca32a26f7658730a1e2313fd83ecc5..6df5c047f76ce1c4c7f0b1b055e10332601fc1f1 100644 (file)
--- 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.
index 818a40a898c54dd71dc422eda8c46ecb0e6be63f..e0c4978c3b39cde1c106e9ed76d415b0b12b184b 100644 (file)
@@ -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))