summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--nss/getXXent_r.c39
2 files changed, 20 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index 979d531ca7..14b5008480 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 1998-03-29  Ulrich Drepper  <drepper@cygnus.com>
 
+	* nss/getXXent_r.c: Correctly handle failing setXXent function.
+
 	* inet/netinet/in.h: Use cast to uint32_t in IPv4 macros.
 	Reported by Andreas Jaeger.
 
diff --git a/nss/getXXent_r.c b/nss/getXXent_r.c
index b709a4a935..1d27cfc66a 100644
--- a/nss/getXXent_r.c
+++ b/nss/getXXent_r.c
@@ -261,32 +261,29 @@ INTERNAL (REENTRANT_GETNAME) (LOOKUP_TYPE *resbuf, char *buffer, size_t buflen,
 	  && errno == ERANGE)
 	break;
 
-      no_more = __nss_next (&nip, GETFUNC_NAME_STRING, (void **) &fct,
-			    status, 0);
+      do
+	{
+	  no_more = __nss_next (&nip, GETFUNC_NAME_STRING, (void **) &fct,
+				status, 0);
 
-      if (is_last_nip)
-	last_nip = nip;
+	  if (is_last_nip)
+	    last_nip = nip;
 
-      if (! no_more && current_nip != nip)
-	/* Call the `setXXent' function.  This wasn't done before.  */
-	do
-	  {
-	    set_function sfct;
+	  if (! no_more)
+	    {
+	      /* Call the `setXXent' function.  This wasn't done before.  */
+	      set_function sfct;
 
-	    no_more = __nss_lookup (&nip, SETFUNC_NAME_STRING,
-				    (void **) &sfct);
+	      no_more = __nss_lookup (&nip, SETFUNC_NAME_STRING,
+				      (void **) &sfct);
 
-	    if (! no_more)
-	      status = (*sfct) (STAYOPEN_TMPVAR);
-	    else
-	      {
+	      if (! no_more)
+		status = (*sfct) (STAYOPEN_TMPVAR);
+	      else
 		status = NSS_STATUS_NOTFOUND;
-		if (no_more == 1)
-		  /* There is no more module to search.  */
-		  break;
-	      }
-	  }
-	while (! no_more && status != NSS_STATUS_SUCCESS);
+	    }
+	}
+      while (! no_more && status != NSS_STATUS_SUCCESS);
     }
 
   __libc_lock_unlock (lock);