summary refs log tree commit diff
path: root/nscd
diff options
context:
space:
mode:
Diffstat (limited to 'nscd')
-rw-r--r--nscd/hstcache.c55
1 files changed, 33 insertions, 22 deletions
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,23 +247,28 @@ 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 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, key_copy, req->key_len, data, total,
+	    cache_add (GETHOSTBYNAME, data->strdata, h_name_len, data, total,
 		       data, 0, t, db, owner);
-	  cache_add (GETHOSTBYNAMEv6, key_copy, req->key_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);
     }