summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--nscd/hstcache.c29
2 files changed, 21 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index de56baf2ff..0bff99b0b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,10 +1,16 @@
 2002-08-26  Ulrich Drepper  <drepper@redhat.com>
 
+	* nscd/hstcache.c (cache_addhst): Add new parameter saying whether
+	entry was for getaddr* lookup or not.  Add only matching cache
+	entry.  Change all callers [PR libc/4317].
+
 	* libio/wfileops.c (_IO_wfile_seekoff): Set fp->_offset after
 	finding the read position [PR libc/4265].
 	* libio/Makefile (tests): Add bug-rewind2.
 	* libio/bug-rewind2.c: New file.
 
+	* libio/bug-rewind.c: Fix creation of temp file.
+
 2002-08-25  Ulrich Drepper  <drepper@redhat.com>
 
 	* nss/getXXbyYY_r.c (REENTRANT_NAME): Return ENOENT if status is
diff --git a/nscd/hstcache.c b/nscd/hstcache.c
index 8866293b6c..dd8fc59f61 100644
--- a/nscd/hstcache.c
+++ b/nscd/hstcache.c
@@ -89,7 +89,7 @@ struct hostdata
 
 static void
 cache_addhst (struct database *db, int fd, request_header *req, void *key,
-	      struct hostent *hst, uid_t owner)
+	      struct hostent *hst, uid_t owner, int add_addr)
 {
   ssize_t total;
   ssize_t written;
@@ -219,7 +219,7 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
          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)
+      if (!add_addr && hst->h_addr_list[1] == NULL)
 	for (cnt = 0; cnt < h_aliases_cnt; ++cnt)
 	  {
 	    if (addr_list_type == GETHOSTBYADDR)
@@ -233,15 +233,16 @@ cache_addhst (struct database *db, int fd, request_header *req, void *key,
 	  }
 
       /* Next the normal addresses.  */
-      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);
-	  addresses += hst->h_length;
-	}
+      if (add_addr)
+	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);
+	    addresses += hst->h_length;
+	  }
 
       /* If necessary the IPv6 addresses.  */
-      if (addr_list_type == GETHOSTBYADDR)
+      if (add_addr && addr_list_type == GETHOSTBYADDR)
 	for (cnt = 0; cnt < h_addr_list_cnt; ++cnt)
 	  {
 	    cache_add (GETHOSTBYADDRv6, addresses, IN6ADDRSZ, data, total,
@@ -251,7 +252,7 @@ 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 (hst->h_addr_list[1] == NULL)
+      if (!add_addr && hst->h_addr_list[1] == NULL)
 	{
 	  /* If necessary add the key for this request.  */
 	  if (req->type == GETHOSTBYNAME || req->type == GETHOSTBYNAMEv6)
@@ -349,7 +350,7 @@ addhstbyname (struct database *db, int fd, request_header *req,
   if (secure[hstdb])
     seteuid (oldeuid);
 
-  cache_addhst (db, fd, req, key, hst, uid);
+  cache_addhst (db, fd, req, key, hst, uid, 0);
 
   if (use_malloc)
     free (buffer);
@@ -426,7 +427,7 @@ addhstbyaddr (struct database *db, int fd, request_header *req,
   if (secure[hstdb])
     seteuid (oldeuid);
 
-  cache_addhst (db, fd, req, key, hst, uid);
+  cache_addhst (db, fd, req, key, hst, uid, 1);
 
   if (use_malloc)
     free (buffer);
@@ -504,7 +505,7 @@ addhstbynamev6 (struct database *db, int fd, request_header *req,
   if (secure[hstdb])
     seteuid (oldeuid);
 
-  cache_addhst (db, fd, req, key, hst, uid);
+  cache_addhst (db, fd, req, key, hst, uid, 0);
 
   if (use_malloc)
     free (buffer);
@@ -581,7 +582,7 @@ addhstbyaddrv6 (struct database *db, int fd, request_header *req,
   if (secure[hstdb])
     seteuid (oldeuid);
 
-  cache_addhst (db, fd, req, key, hst, uid);
+  cache_addhst (db, fd, req, key, hst, uid, 1);
 
   if (use_malloc)
     free (buffer);