Signal temporary host lookup errors in nscd as such to the requester.
authorUlrich Drepper <drepper@gmail.com>
Sat, 15 Jan 2011 16:10:11 +0000 (11:10 -0500)
committerUlrich Drepper <drepper@gmail.com>
Sat, 15 Jan 2011 16:10:11 +0000 (11:10 -0500)
ChangeLog
NEWS
nscd/hstcache.c

index 08c3535849c012fb65a15c26abc49798c27d53d3..b55aaacf4cdc87948a29e33d1d8992822d7ed1a0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2011-01-15  Ulrich Drepper  <drepper@gmail.com>
+
+       [BZ #6812]
+       * nscd/hstcache.c (tryagain): Define.
+       (cache_addhst): Return tryagain not notfound for temporary errors.
+       (addhstbyX): Also set h_errno to TRY_AGAIN when memory allocation
+       failed.
+
 2011-01-14  Ulrich Drepper  <drepper@gmail.com>
 
        [BZ #10563]
diff --git a/NEWS b/NEWS
index 01984f632d988b3451c0ce887a76fc7a38fa18d1..7444b9de6bbf65bdb64635418f53a7a11b176750 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes.  2011-1-14
+GNU C Library NEWS -- history of user-visible changes.  2011-1-15
 Copyright (C) 1992-2009, 2010, 2011 Free Software Foundation, Inc.
 See the end for copying conditions.
 
@@ -9,11 +9,11 @@ Version 2.13
 
 * The following bugs are resolved with this release:
 
-  3268, 7066, 10085, 10484, 10563, 10851, 11149, 11155, 11611, 11640, 11655,
-  11701, 11840, 11856, 11883, 11903, 11904, 11968, 11979, 12005, 12037,
-  12067, 12077, 12078, 12092, 12093, 12107, 12108, 12113, 12140, 12159,
-  12167, 12191, 12194, 12201, 12204, 12205, 12207, 12348, 12378, 12394,
-  12397
+  3268, 6812, 7066, 10085, 10484, 10563, 10851, 11149, 11155, 11611, 11640,
+  11655, 11701, 11840, 11856, 11883, 11903, 11904, 11968, 11979, 12005,
+  12037, 12067, 12077, 12078, 12092, 12093, 12107, 12108, 12113, 12140,
+  12159, 12167, 12191, 12194, 12201, 12204, 12205, 12207, 12348, 12378,
+  12394, 12397
 
 * New Linux interfaces: prlimit, prlimit64, fanotify_init, fanotify_mark
 
index 228f6fd8ab1a7f54ac6644f702eec19d118bb5ab..a6055cf998329b0db0de237fa42aa6f7a2dd96e0 100644 (file)
@@ -1,5 +1,5 @@
 /* Cache handling for host lookup.
-   Copyright (C) 1998-2008, 2009 Free Software Foundation, Inc.
+   Copyright (C) 1998-2008, 2009, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
@@ -77,6 +77,20 @@ static const hst_response_header notfound =
 };
 
 
+/* This is the standard reply in case there are temporary problems.  */
+static const hst_response_header tryagain =
+{
+  .version = NSCD_VERSION,
+  .found = 0,
+  .h_name_len = 0,
+  .h_aliases_cnt = 0,
+  .h_addrtype = -1,
+  .h_length = -1,
+  .h_addr_list_cnt = 0,
+  .error = TRY_AGAIN
+};
+
+
 static void
 cache_addhst (struct database_dyn *db, int fd, request_header *req,
              const void *key, struct hostent *hst, uid_t owner,
@@ -111,11 +125,15 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
       else
        {
          /* We have no data.  This means we send the standard reply for this
-            case.  */
+            case.  Possibly this is only temporary.  */
          ssize_t total = sizeof (notfound);
+         assert (sizeof (notfound) == sizeof (tryagain));
+
+         const hst_response_header *resp = (errval == EAGAIN
+                                            ? &tryagain : &notfound);
 
          if (fd != -1 &&
-             TEMP_FAILURE_RETRY (send (fd, &notfound, total,
+             TEMP_FAILURE_RETRY (send (fd, resp, total,
                                        MSG_NOSIGNAL)) != total)
            all_written = false;
 
@@ -135,7 +153,7 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
                                           ? db->negtimeout : ttl);
 
              /* This is the reply.  */
-             memcpy (&dataset->resp, &notfound, total);
+             memcpy (&dataset->resp, resp, total);
 
              /* Copy the key data.  */
              memcpy (dataset->strdata, key, req->key_len);
@@ -490,6 +508,7 @@ addhstbyX (struct database_dyn *db, int fd, request_header *req,
              /* We set the error to indicate this is (possibly) a
                 temporary error and that it does not mean the entry
                 is not available at all.  */
+             h_errno = TRY_AGAIN;
              errval = EAGAIN;
              break;
            }