[PATCH] Re: Problems in new compat NSS module?

Thorsten Kukuk kukuk@suse.de
Mon Sep 1 20:06:00 GMT 2003


Hi,

the nss_compat has two problems with shadow over NIS:
- getspnam does not always work, one return value was wrong.
- +XYZ/-XYZ entries did never work in the past. It seems nobody is
   using such entries.

The appended patch fixes both problems.

  Thorsten

-- 
Thorsten Kukuk       http://www.suse.de/~kukuk/        kukuk@suse.de
SuSE Linux AG        Deutschherrnstr. 15-19        D-90429 Nuernberg
--------------------------------------------------------------------    
Key fingerprint = A368 676B 5E1B 3E46 CFCE  2D97 F8FD 4E23 56C6 FB4B
-------------- next part --------------
2003-09-01  Thorsten Kukuk  <kukuk@suse.de>

	* nis/nss_compat/compat-spwd.c (getspnam_plususer): return
	NSS_STATUS_SUCCESS if entry was found.
	(getspent_next_file): store user in blacklist after entry
	was found, use innetgr.
	

--- nis/nss_compat/compat-spwd.c
+++ nis/nss_compat/compat-spwd.c	2003/09/01 15:14:14
@@ -435,7 +435,7 @@
   copy_spwd_changes (result, &pwd, p, plen);
   give_spwd_free (&pwd);
   /* We found the entry.  */
-  return NSS_STATUS_RETURN;
+  return NSS_STATUS_SUCCESS;
 }
 
 static enum nss_status
@@ -539,13 +539,16 @@
       if (result->sp_namp[0] == '+' && result->sp_namp[1] != '\0'
 	  && result->sp_namp[1] != '@')
 	{
+          size_t len = strlen (result->sp_namp);
+          char buf[len];
 	  enum nss_status status;
 
 	  /* Store the User in the blacklist for the "+" at the end of
 	     /etc/passwd */
-	  blacklist_store_name (&result->sp_namp[1], ent);
+          memcpy (buf, &result->sp_namp[1], len);
 	  status = getspnam_plususer (&result->sp_namp[1], result, ent,
 				      buffer, buflen, errnop);
+	  blacklist_store_name (buf, ent);
 
 	  if (status == NSS_STATUS_SUCCESS)	/* We found the entry. */
 	    break;
@@ -653,6 +656,9 @@
 	      return NSS_STATUS_TRYAGAIN;
 	    }
 
+          /* Terminate the line for any case.  */
+          buffer[buflen - 1] = '\0';
+
 	  /* Skip leading blanks.  */
 	  while (isspace (*p))
 	    ++p;
@@ -686,21 +692,8 @@
       if (result->sp_namp[0] == '-' && result->sp_namp[1] == '@'
 	  && result->sp_namp[2] != '\0')
 	{
-	  /* XXX Do not use fixed length buffers.  */
-	  char buf2[1024];
-	  char *user, *host, *domain;
-	  struct __netgrent netgrdata;
-
-	  bzero (&netgrdata, sizeof (struct __netgrent));
-	  __internal_setnetgrent (&result->sp_namp[2], &netgrdata);
-	  while (__internal_getnetgrent_r (&host, &user, &domain, &netgrdata,
-					   buf2, sizeof (buf2), errnop))
-	    {
-	      if (user != NULL && user[0] != '-')
-		if (strcmp (user, name) == 0)
-		  return NSS_STATUS_NOTFOUND;
-	    }
-	  __internal_endnetgrent (&netgrdata);
+	  if (innetgr (&result->sp_namp[2], NULL, name, NULL))
+            return NSS_STATUS_NOTFOUND;
 	  continue;
 	}
 
@@ -708,25 +701,18 @@
       if (result->sp_namp[0] == '+' && result->sp_namp[1] == '@'
 	  && result->sp_namp[2] != '\0')
 	{
-	  char *buf = strdupa (&result->sp_namp[2]);
-	  int status;
+          enum nss_status status;
 
-	  ent->netgroup = TRUE;
-	  ent->first = TRUE;
-	  copy_spwd_changes (&ent->pwd, result, NULL, 0);
+          if (innetgr (&result->sp_namp[2], NULL, name, NULL))
+            {
+              status = getspnam_plususer (name, result, ent, buffer,
+                                          buflen, errnop);
 
-	  do
-	    {
-	      status = getspent_next_nss_netgr (name, result, ent, buf,
-						buffer, buflen, errnop);
-	      if (status == NSS_STATUS_RETURN)
-		continue;
+              if (status == NSS_STATUS_RETURN)
+                continue;
 
-	      if (status == NSS_STATUS_SUCCESS
-		  && strcmp (result->sp_namp, name) == 0)
-		return NSS_STATUS_SUCCESS;
-	    }
-	  while (status == NSS_STATUS_SUCCESS);
+              return status;
+            }
 	  continue;
 	}
 
@@ -767,10 +753,12 @@
 	  status = getspnam_plususer (name, result, ent,
 				      buffer, buflen, errnop);
 
-	  if (status == NSS_STATUS_RETURN)	/* We couldn't parse the entry */
-	    return NSS_STATUS_NOTFOUND;
-	  else
-	    return status;
+          if (status == NSS_STATUS_SUCCESS)     /* We found the entry. */
+            break;
+          else if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */
+            return NSS_STATUS_NOTFOUND;
+          else
+            return status;
 	}
     }
   return NSS_STATUS_SUCCESS;
@@ -796,10 +784,8 @@
 
   result = internal_setspent (&ent, 0);
 
-  if (result != NSS_STATUS_SUCCESS)
-    return result;
-
-  result = internal_getspnam_r (name, pwd, &ent, buffer, buflen, errnop);
+  if (result == NSS_STATUS_SUCCESS)
+    result = internal_getspnam_r (name, pwd, &ent, buffer, buflen, errnop);
 
   internal_endspent (&ent);
 


More information about the Libc-alpha mailing list