diff --git a/ChangeLog b/ChangeLog index 0344dc1094..9d1c7b0d3a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2000-02-17 Ulrich Drepper + + * nscd/hstcache.c (cache_addhst): Don't cache name->record entries + if more than one IP address is available. + 2000-02-17 Jakub Jelinek * sysdeps/unix/sysv/linux/sparc/bits/termios.h: Sync with kernel. diff --git a/nscd/hstcache.c b/nscd/hstcache.c index 5ac0cee816..253b76c65d 100644 --- a/nscd/hstcache.c +++ b/nscd/hstcache.c @@ -211,18 +211,24 @@ 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. */ - for (cnt = 0; cnt < h_aliases_cnt; ++cnt) - { - if (addr_list_type == GETHOSTBYADDR) - cache_add (GETHOSTBYNAME, aliases, h_aliases_len[cnt], data, total, - data, 0, t, db, owner); + /* 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 (hst->h_addr_list[1] == NULL) + for (cnt = 0; cnt < h_aliases_cnt; ++cnt) + { + if (addr_list_type == GETHOSTBYADDR) + cache_add (GETHOSTBYNAME, aliases, h_aliases_len[cnt], data, + total, data, 0, t, db, owner); - cache_add (GETHOSTBYNAMEv6, aliases, h_aliases_len[cnt], data, total, - data, 0, t, db, owner); + cache_add (GETHOSTBYNAMEv6, aliases, h_aliases_len[cnt], data, + total, data, 0, t, db, owner); - aliases += h_aliases_len[cnt]; - } + aliases += h_aliases_len[cnt]; + } /* Next the normal addresses. */ for (cnt = 0; cnt < h_addr_list_cnt; ++cnt) @@ -241,22 +247,27 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key, addresses += IN6ADDRSZ; } - /* If necessary add the key for this request. */ - if (req->type == GETHOSTBYNAME || req->type == GETHOSTBYNAMEv6) + /* Avoid adding names if more than one address is available. See + above for more info. */ + if (hst->h_addr_list[1] == NULL) { - if (addr_list_type == GETHOSTBYADDR) - cache_add (GETHOSTBYNAME, key_copy, req->key_len, data, total, - data, 0, t, db, owner); - cache_add (GETHOSTBYNAMEv6, key_copy, req->key_len, data, - total, data, 0, t, db, owner); - } + /* If necessary add the key for this request. */ + if (req->type == GETHOSTBYNAME || req->type == GETHOSTBYNAMEv6) + { + if (addr_list_type == GETHOSTBYADDR) + cache_add (GETHOSTBYNAME, key_copy, req->key_len, data, total, + data, 0, t, db, owner); + cache_add (GETHOSTBYNAMEv6, key_copy, req->key_len, data, + total, data, 0, t, db, owner); + } - /* And finally the name. We mark this as the last entry. */ - if (addr_list_type == GETHOSTBYADDR) - cache_add (GETHOSTBYNAME, data->strdata, h_name_len, data, total, data, - 0, t, db, owner); - cache_add (GETHOSTBYNAMEv6, data->strdata, h_name_len, data, - total, data, 1, t, db, owner); + /* And finally the name. We mark this as the last entry. */ + if (addr_list_type == GETHOSTBYADDR) + cache_add (GETHOSTBYNAME, data->strdata, h_name_len, data, total, + data, 0, t, db, owner); + cache_add (GETHOSTBYNAMEv6, data->strdata, h_name_len, data, + total, data, 1, t, db, owner); + } pthread_rwlock_unlock (&db->lock); }