diff options
author | Ulrich Drepper <drepper@redhat.com> | 2007-08-22 03:30:02 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2007-08-22 03:30:02 +0000 |
commit | c44d3bdf14b75389f1fea86bfb03c9c38ea40f17 (patch) | |
tree | 388702593c49b2a7b0bdccc6872f3fcb5e348b32 | |
parent | 1ce7d80ddc62d4bb3e8e4f89fbcb6fa21361733d (diff) | |
download | glibc-c44d3bdf14b75389f1fea86bfb03c9c38ea40f17.tar.gz glibc-c44d3bdf14b75389f1fea86bfb03c9c38ea40f17.tar.xz glibc-c44d3bdf14b75389f1fea86bfb03c9c38ea40f17.zip |
[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.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | nscd/hstcache.c | 32 |
2 files changed, 24 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog index 19dae1f6b5..847b80aa5f 100644 --- 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. diff --git a/nscd/hstcache.c b/nscd/hstcache.c index 74de8f6567..54222a3408 100644 --- a/nscd/hstcache.c +++ b/nscd/hstcache.c @@ -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. */ |