[BZ #4905]
authorUlrich Drepper <drepper@redhat.com>
Wed, 22 Aug 2007 03:30:02 +0000 (03:30 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 22 Aug 2007 03:30:02 +0000 (03:30 +0000)
* nscd/hstcache.c (cache_addhst): When reloading an entry which
suddenly has two or more addresses, ignore it and remove the old
entry.

ChangeLog
nscd/hstcache.c

index 19dae1f..847b80a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2007-08-21  Ulrich Drepper  <drepper@redhat.com>
 
+       [BZ #4905]
+       * nscd/hstcache.c (cache_addhst): When reloading an entry which
+       suddenly has two or more addresses, ignore it and remove the old
+       entry.
+
        [BZ #4814]
        * resolv/res_hconf.c: Prepare for compiling outside libc.
        * nscd/res_hconf.c: New file.
index 74de8f6..54222a3 100644 (file)
@@ -298,25 +298,31 @@ cache_addhst (struct database_dyn *db, int fd, request_header *req,
              /* The data has not changed.  We will just bump the
                 timeout value.  Note that the new record has been
                 allocated on the stack and need not be freed.  */
+             assert (h_addr_list_cnt == 1);
              dh->timeout = dataset->head.timeout;
              ++dh->nreloads;
            }
          else
            {
-             /* We have to create a new record.  Just allocate
-                appropriate memory and copy it.  */
-             struct dataset *newp
-               = (struct dataset *) mempool_alloc (db, total + req->key_len);
-             if (newp != NULL)
+             if (h_addr_list_cnt == 1)
                {
-                 /* Adjust pointers into the memory block.  */
-                 addresses = (char *) newp + (addresses - (char *) dataset);
-                 aliases = (char *) newp + (aliases - (char *) dataset);
-                 assert (key_copy != NULL);
-                 key_copy = (char *) newp + (key_copy - (char *) dataset);
-
-                 dataset = memcpy (newp, dataset, total + req->key_len);
-                 alloca_used = false;
+                 /* We have to create a new record.  Just allocate
+                    appropriate memory and copy it.  */
+                 struct dataset *newp
+                   = (struct dataset *) mempool_alloc (db,
+                                                       total + req->key_len);
+                 if (newp != NULL)
+                   {
+                     /* Adjust pointers into the memory block.  */
+                     addresses = (char *) newp + (addresses
+                                                  - (char *) dataset);
+                     aliases = (char *) newp + (aliases - (char *) dataset);
+                     assert (key_copy != NULL);
+                     key_copy = (char *) newp + (key_copy - (char *) dataset);
+
+                     dataset = memcpy (newp, dataset, total + req->key_len);
+                     alloca_used = false;
+                   }
                }
 
              /* Mark the old record as obsolete.  */