2003-09-01 Thorsten Kukuk * 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);