diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-07-27 01:14:37 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-07-27 01:14:37 +0000 |
commit | 490998a5f2160f4bf7026e74abb9bd2bcffee953 (patch) | |
tree | fdbdcb25bc1da8da5861b5480251eb97c0e281b1 /nscd/hstcache.c | |
parent | f3285f86f512ec05d101b4b995733180c4a71883 (diff) | |
download | glibc-490998a5f2160f4bf7026e74abb9bd2bcffee953.tar.gz glibc-490998a5f2160f4bf7026e74abb9bd2bcffee953.tar.xz glibc-490998a5f2160f4bf7026e74abb9bd2bcffee953.zip |
Update.
* nscd/hstcache.c (cache_addhst): Fix two scenarios which lead to memory leaks.
Diffstat (limited to 'nscd/hstcache.c')
-rw-r--r-- | nscd/hstcache.c | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/nscd/hstcache.c b/nscd/hstcache.c index cf2a98c471..44b76aa7c0 100644 --- a/nscd/hstcache.c +++ b/nscd/hstcache.c @@ -199,6 +199,17 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key, unnecessarily let the receiver wait. */ written = TEMP_FAILURE_RETRY (write (fd, data, total)); + /* If the record contains more than one IP address (used for + load balancing etc) don't cache the entry. This is something + the current cache handling cannot handle and it is more than + questionable whether it is worthwhile complicating the cache + handling just for handling such a special case. */ + if (!add_addr && hst->h_addr_list[1] != NULL) + { + free (data); + return; + } + addr_list_type = (hst->h_length == NS_INADDRSZ ? GETHOSTBYADDR : GETHOSTBYADDRv6); @@ -208,13 +219,9 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key, /* Now get the lock to safely insert the records. */ pthread_rwlock_rdlock (&db->lock); - /* First add all the aliases. If the record contains more than - one IP address (used for load balancing etc) don't cache the - entry. This is something the current cache handling cannot - handle and it is more than questionable whether it is - worthwhile complicating the cache handling just for handling - such a special case. */ - if (!add_addr && hst->h_addr_list[1] == NULL) + /* First add all the aliases. */ + assert (add_addr || hst->h_addr_list[1] == NULL); + if (!add_addr) for (cnt = 0; cnt < h_aliases_cnt; ++cnt) { if (addr_list_type == GETHOSTBYADDR) @@ -232,7 +239,7 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key, for (cnt = 0; cnt < h_addr_list_cnt; ++cnt) { cache_add (addr_list_type, addresses, hst->h_length, data, total, - data, 0, t, db, owner); + data, cnt + 1 == h_addr_list_cnt, t, db, owner); addresses += hst->h_length; } @@ -247,9 +254,11 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key, /* Avoid adding names if more than one address is available. See above for more info. */ - if (!add_addr && hst->h_addr_list[1] == NULL) + if (!add_addr) { - /* If necessary add the key for this request. */ + /* If necessary add the key for this request. + + Note: hst->h_addr_list[1] == NULL. */ if (req->type == GETHOSTBYNAME || req->type == GETHOSTBYNAMEv6) { if (addr_list_type == GETHOSTBYADDR) |