diff options
Diffstat (limited to 'nis/nss_compat')
-rw-r--r-- | nis/nss_compat/compat-grp.c | 54 | ||||
-rw-r--r-- | nis/nss_compat/compat-pwd.c | 74 | ||||
-rw-r--r-- | nis/nss_compat/compat-spwd.c | 96 |
3 files changed, 121 insertions, 103 deletions
diff --git a/nis/nss_compat/compat-grp.c b/nis/nss_compat/compat-grp.c index 6231a1e911..372212d0a3 100644 --- a/nis/nss_compat/compat-grp.c +++ b/nis/nss_compat/compat-grp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996 Free Software Foundation, Inc. +/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. @@ -88,13 +88,13 @@ internal_setgrent (ent_t *ent) ent->oldkey = NULL; ent->oldkeylen = 0; } - + if (ent->result != NULL) { nis_freeresult (ent->result); ent->result = NULL; } - + if (ent->names != NULL) { nis_freenames (ent->names); @@ -104,11 +104,11 @@ internal_setgrent (ent_t *ent) ent->blacklist.current = 0; if (ent->blacklist.data != NULL) ent->blacklist.data[0] = '\0'; - + if (ent->stream == NULL) { ent->stream = fopen ("/etc/group", "r"); - + if (ent->stream == NULL) status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; } @@ -163,7 +163,7 @@ internal_endgrent (ent_t *ent) nis_freeresult (ent->result); ent->result = NULL; } - + if (ent->names != NULL) { nis_freenames (ent->names); @@ -245,15 +245,15 @@ getgrent_next_nis (struct group *result, ent_t *ent, char *buffer, while (isspace (*p)) ++p; - + parse_res = _nss_files_parse_grent (p, result, data, buflen); - - if (parse_res && + + if (parse_res && in_blacklist (result->gr_name, strlen (result->gr_name), ent)) parse_res = 0; /* if result->gr_name in blacklist,search next entry */ } while (!parse_res); - + return NSS_STATUS_SUCCESS; } @@ -262,7 +262,7 @@ getgrent_next_nisplus (struct group *result, ent_t *ent, char *buffer, size_t buflen) { int parse_res; - + if (ent->names == NULL) { ent->names = nis_getnames ("group.org_dir"); @@ -272,7 +272,7 @@ getgrent_next_nisplus (struct group *result, ent_t *ent, char *buffer, return NSS_STATUS_UNAVAIL; } } - + do { if (ent->nis_first) @@ -289,8 +289,8 @@ getgrent_next_nisplus (struct group *result, ent_t *ent, char *buffer, else { nis_result *res; - - res = nis_next_entry(ent->names[ent->names_nr], + + res = nis_next_entry(ent->names[ent->names_nr], &ent->result->cookie); nis_freeresult (ent->result); ent->result = res; @@ -310,14 +310,14 @@ getgrent_next_nisplus (struct group *result, ent_t *ent, char *buffer, } } } - parse_res = _nss_nisplus_parse_grent (ent->result, result, buffer, + parse_res = _nss_nisplus_parse_grent (ent->result, result, buffer, buflen); - if (parse_res && + if (parse_res && in_blacklist (result->gr_name, strlen (result->gr_name), ent)) parse_res = 0; /* if result->gr_name in blacklist,search next entry */ } while (!parse_res); - + return NSS_STATUS_SUCCESS; } @@ -328,7 +328,7 @@ getgrent_next_file_plusgroup (struct group *result, char *buffer, { struct parser_data *data = (void *) buffer; int parse_res; - + if (use_nisplus) /* Do the NIS+ query here */ { nis_result *res; @@ -340,7 +340,7 @@ getgrent_next_file_plusgroup (struct group *result, char *buffer, if (niserr2nss (res->status) != NSS_STATUS_SUCCESS) { enum nss_status status = niserr2nss (res->status); - + nis_freeresult (res); return status; } @@ -354,7 +354,7 @@ getgrent_next_file_plusgroup (struct group *result, char *buffer, if (yp_get_default_domain (&domain) != YPERR_SUCCESS) return NSS_STATUS_TRYAGAIN; - + if (yp_match (domain, "group.byname", &result->gr_name[1], strlen (result->gr_name) - 1, &outval, &outvallen) != YPERR_SUCCESS) @@ -420,7 +420,7 @@ getgrent_next_file (struct group *result, ent_t *ent, && result->gr_name[1] != '@') { enum nss_status status; - + status = getgrent_next_file_plusgroup (result, buffer, buflen); if (status == NSS_STATUS_SUCCESS) /* We found the entry. */ break; @@ -506,7 +506,7 @@ _nss_compat_getgrnam_r (const char *name, struct group *grp, __nss_database_lookup ("group_compat", NULL, "nis", &ni); use_nisplus = (strcmp (ni->name, "nisplus") == 0); } - + __libc_lock_unlock (lock); status = internal_setgrent (&ent); @@ -531,13 +531,13 @@ _nss_compat_getgrgid_r (gid_t gid, struct group *grp, enum nss_status status; __libc_lock_lock (lock); - + if (ni == NULL) { __nss_database_lookup ("group_compat", NULL, "nis", &ni); use_nisplus = (strcmp (ni->name, "nisplus") == 0); } - + __libc_lock_unlock (lock); status = internal_setgrent (&ent); @@ -605,10 +605,14 @@ static bool_t in_blacklist (const char *name, int namelen, ent_t *ent) { char buf[namelen + 3]; + char *cp; if (ent->blacklist.data == NULL) return FALSE; - stpcpy (stpcpy (stpcpy (buf, "|"), name), "|"); + buf[0] = '|'; + cp = stpcpy (&buf[1], name); + *cp++= '|'; + *cp = '\0'; return strstr (ent->blacklist.data, buf) != NULL; } diff --git a/nis/nss_compat/compat-pwd.c b/nis/nss_compat/compat-pwd.c index 317e2d18bf..1a80355d0f 100644 --- a/nis/nss_compat/compat-pwd.c +++ b/nis/nss_compat/compat-pwd.c @@ -321,7 +321,7 @@ getpwent_next_nis_netgr (struct passwd *result, ent_t *ent, char *group, char *ypdomain, *host, *user, *domain, *outval, *p, *p2; int status, outvallen; size_t p2len; - + if (yp_get_default_domain (&ypdomain) != YPERR_SUCCESS) { ent->netgroup = 0; @@ -390,8 +390,8 @@ getpwent_next_nisplus_netgr (struct passwd *result, ent_t *ent, char *group, int status, parse_res; size_t p2len; nis_result *nisres; - - /* Maybe we should use domainname here ? We need the current + + /* Maybe we should use domainname here ? We need the current domainname for the domain field in netgroups */ if (yp_get_default_domain (&ypdomain) != YPERR_SUCCESS) { @@ -434,7 +434,7 @@ getpwent_next_nisplus_netgr (struct passwd *result, ent_t *ent, char *group, } p2 = buffer + (buflen - p2len); buflen -= p2len; - { + { char buf[strlen (user) + 30]; sprintf(buf, "[name=%s],passwd.org_dir", user); nisres = nis_list(buf, EXPAND_NAME, NULL, NULL); @@ -446,7 +446,7 @@ getpwent_next_nisplus_netgr (struct passwd *result, ent_t *ent, char *group, } parse_res = _nss_nisplus_parse_pwent (nisres, result, buffer, buflen); nis_freeresult (nisres); - + if (parse_res) { copy_pwd_changes (result, &ent->pwd, p2, p2len); @@ -484,7 +484,7 @@ getpwent_next_nisplus (struct passwd *result, ent_t *ent, char *buffer, return NSS_STATUS_UNAVAIL; } } - + p2len = pwd_need_buflen (&ent->pwd); if (p2len > buflen) { @@ -510,8 +510,8 @@ getpwent_next_nisplus (struct passwd *result, ent_t *ent, char *buffer, else { nis_result *res; - - res = nis_next_entry(ent->names[ent->names_nr], + + res = nis_next_entry(ent->names[ent->names_nr], &ent->result->cookie); nis_freeresult (ent->result); ent->result = res; @@ -532,16 +532,16 @@ getpwent_next_nisplus (struct passwd *result, ent_t *ent, char *buffer, } } } - parse_res = _nss_nisplus_parse_pwent (ent->result, result, buffer, + parse_res = _nss_nisplus_parse_pwent (ent->result, result, buffer, buflen); - if (parse_res && + if (parse_res && in_blacklist (result->pw_name, strlen (result->pw_name), ent)) parse_res = 0; /* if result->pw_name in blacklist,search next entry */ } while (!parse_res); - + copy_pwd_changes (result, &ent->pwd, p2, p2len); - + return NSS_STATUS_SUCCESS; } @@ -623,7 +623,7 @@ getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer, /* This function handle the +user entrys in /etc/passwd */ static enum nss_status -getpwent_next_file_plususer (struct passwd *result, char *buffer, +getpwent_next_file_plususer (struct passwd *result, char *buffer, size_t buflen) { struct parser_data *data = (void *) buffer; @@ -631,11 +631,11 @@ getpwent_next_file_plususer (struct passwd *result, char *buffer, int parse_res; char *p; size_t plen; - + memset (&pwd, '\0', sizeof (struct passwd)); - + copy_pwd_changes (&pwd, result, NULL, 0); - + plen = pwd_need_buflen (&pwd); if (plen > buflen) { @@ -644,19 +644,19 @@ getpwent_next_file_plususer (struct passwd *result, char *buffer, } p = buffer + (buflen - plen); buflen -= plen; - + if (use_nisplus) /* Do the NIS+ query here */ { nis_result *res; char buf[strlen (result->pw_name) + 24]; - + sprintf(buf, "[name=%s],passwd.org_dir", &result->pw_name[1]); res = nis_list(buf, EXPAND_NAME, NULL, NULL); if (niserr2nss (res->status) != NSS_STATUS_SUCCESS) { enum nss_status status = niserr2nss (res->status); - + nis_freeresult (res); return status; } @@ -668,22 +668,22 @@ getpwent_next_file_plususer (struct passwd *result, char *buffer, char *domain; char *outval; int outvallen; - + if (yp_get_default_domain (&domain) != YPERR_SUCCESS) return NSS_STATUS_TRYAGAIN; - + if (yp_match (domain, "passwd.byname", &result->pw_name[1], strlen (result->pw_name) - 1, &outval, &outvallen) != YPERR_SUCCESS) return NSS_STATUS_TRYAGAIN; - p = strncpy (buffer, outval, + p = strncpy (buffer, outval, buflen < outvallen ? buflen : outvallen); free (outval); while (isspace (*p)) p++; parse_res = _nss_files_parse_pwent (p, result, data, buflen); } - + if (parse_res) { copy_pwd_changes (result, &pwd, p, plen); @@ -735,15 +735,19 @@ getpwent_next_file (struct passwd *result, ent_t *ent, if (result->pw_name[0] == '-' && result->pw_name[1] == '@' && result->pw_name[2] != '\0') { + char buf2[1024]; char *user, *host, *domain; + struct __netgrent netgrdata; - setnetgrent (&result->pw_name[2]); - while (getnetgrent (&host, &user, &domain)) + bzero (&netgrdata, sizeof (struct __netgrent)); + __internal_setnetgrent (&result->pw_name[2], &netgrdata); + while (__internal_getnetgrent_r (&host, &user, &domain, + &netgrdata, buf2, sizeof (buf2))) { if (user != NULL && user[0] != '-') blacklist_store_name (user, ent); } - endnetgrent (); + __internal_endnetgrent (&netgrdata); continue; } @@ -778,7 +782,7 @@ getpwent_next_file (struct passwd *result, ent_t *ent, && result->pw_name[1] != '@') { enum nss_status status; - + status = getpwent_next_file_plususer (result, buffer, buflen); if (status == NSS_STATUS_SUCCESS) /* We found the entry. */ break; @@ -879,7 +883,7 @@ _nss_compat_getpwnam_r (const char *name, struct passwd *pwd, __nss_database_lookup ("passwd_compat", NULL, "nis", &ni); use_nisplus = (strcmp (ni->name, "nisplus") == 0); } - + __libc_lock_unlock (lock); status = internal_setpwent (&ent); @@ -903,17 +907,17 @@ _nss_compat_getpwuid_r (uid_t uid, struct passwd *pwd, ent_t ent = {0, 0, 0, NULL, 0, NULL, NULL, 0, NULL, {NULL, 0, 0}, {NULL, NULL, 0, 0, NULL, NULL, NULL}}; enum nss_status status; - + __libc_lock_lock (lock); - + if (ni == NULL) { __nss_database_lookup ("passwd_compat", NULL, "nis", &ni); use_nisplus = (strcmp (ni->name, "nisplus") == 0); } - + __libc_lock_unlock (lock); - + status = internal_setpwent (&ent); if (status != NSS_STATUS_SUCCESS) return status; @@ -979,10 +983,14 @@ static bool_t in_blacklist (const char *name, int namelen, ent_t *ent) { char buf[namelen + 3]; + char *cp; if (ent->blacklist.data == NULL) return FALSE; - stpcpy (stpcpy (stpcpy (buf, "|"), name), "|"); + buf[0] = '|'; + cp = stpcpy (&buf[1], name); + *cp++= '|'; + *cp = '\0'; return strstr (ent->blacklist.data, buf) != NULL; } diff --git a/nis/nss_compat/compat-spwd.c b/nis/nss_compat/compat-spwd.c index 7c0eb24fc1..74967f8fd4 100644 --- a/nis/nss_compat/compat-spwd.c +++ b/nis/nss_compat/compat-spwd.c @@ -147,7 +147,7 @@ internal_setspent (ent_t *ent) /* If something was left over free it. */ if (ent->netgroup) __internal_endnetgrent (&ent->netgrdata); - + if (ent->oldkey != NULL) { free (ent->oldkey); @@ -166,7 +166,7 @@ internal_setspent (ent_t *ent) ent->names = NULL; } ent->names_nr = 0; - + ent->blacklist.current = 0; if (ent->blacklist.data != NULL) ent->blacklist.data[0] = '\0'; @@ -199,7 +199,7 @@ _nss_compat_setspent (void) __nss_database_lookup ("shadow_compat", "passwd_compat", "nis", &ni); use_nisplus = (strcmp (ni->name, "nisplus") == 0); } - + result = internal_setspent (&ext_ent); __libc_lock_unlock (lock); @@ -240,11 +240,11 @@ internal_endspent (ent_t *ent) ent->names = NULL; } ent->names_nr = 0; - + ent->blacklist.current = 0; if (ent->blacklist.data != NULL) ent->blacklist.data[0] = '\0'; - + give_spwd_free (&ent->pwd); return NSS_STATUS_SUCCESS; @@ -342,8 +342,8 @@ getspent_next_nisplus_netgr (struct spwd *result, ent_t *ent, char *group, int status, parse_res; size_t p2len; nis_result *nisres; - - /* Maybe we should use domainname here ? We need the current + + /* Maybe we should use domainname here ? We need the current domainname for the domain field in netgroups */ if (yp_get_default_domain (&ypdomain) != YPERR_SUCCESS) { @@ -386,7 +386,7 @@ getspent_next_nisplus_netgr (struct spwd *result, ent_t *ent, char *group, } p2 = buffer + (buflen - p2len); buflen -= p2len; - { + { char buf[strlen (user) + 30]; sprintf(buf, "[name=%s],passwd.org_dir", user); nisres = nis_list(buf, EXPAND_NAME, NULL, NULL); @@ -398,7 +398,7 @@ getspent_next_nisplus_netgr (struct spwd *result, ent_t *ent, char *group, } parse_res = _nss_nisplus_parse_spent (nisres, result, buffer, buflen); nis_freeresult (nisres); - + if (parse_res) { copy_spwd_changes (result, &ent->pwd, p2, p2len); @@ -414,9 +414,9 @@ getspent_next_netgr (struct spwd *result, ent_t *ent, char *group, char *buffer, size_t buflen) { if (use_nisplus) - return getpwent_next_nisplus_netgr (result, ent, group, buffer, buflen); + return getspent_next_nisplus_netgr (result, ent, group, buffer, buflen); else - return getpwent_next_nis_netgr (result, ent, group, buffer, buflen); + return getspent_next_nis_netgr (result, ent, group, buffer, buflen); } static enum nss_status @@ -426,7 +426,7 @@ getspent_next_nisplus (struct spwd *result, ent_t *ent, char *buffer, int parse_res; size_t p2len; char *p2; - + if (ent->names == NULL) { ent->names = nis_getnames ("passwd.org_dir"); @@ -436,7 +436,7 @@ getspent_next_nisplus (struct spwd *result, ent_t *ent, char *buffer, return NSS_STATUS_UNAVAIL; } } - + p2len = spwd_need_buflen (&ent->pwd); if (p2len > buflen) { @@ -462,8 +462,8 @@ getspent_next_nisplus (struct spwd *result, ent_t *ent, char *buffer, else { nis_result *res; - - res = nis_next_entry(ent->names[ent->names_nr], + + res = nis_next_entry(ent->names[ent->names_nr], &ent->result->cookie); nis_freeresult (ent->result); ent->result = res; @@ -484,16 +484,16 @@ getspent_next_nisplus (struct spwd *result, ent_t *ent, char *buffer, } } } - parse_res = _nss_nisplus_parse_spent (ent->result, result, buffer, + parse_res = _nss_nisplus_parse_spent (ent->result, result, buffer, buflen); - if (parse_res && + if (parse_res && in_blacklist (result->sp_namp, strlen (result->sp_namp), ent)) parse_res = 0; /* if result->pw_name in blacklist,search next entry */ } while (!parse_res); - + copy_spwd_changes (result, &ent->pwd, p2, p2len); - + return NSS_STATUS_SUCCESS; } @@ -576,7 +576,7 @@ getspent_next_nis (struct spwd *result, ent_t *ent, /* This function handle the +user entrys in /etc/shadow */ static enum nss_status -getspent_next_file_plususer (struct spwd *result, char *buffer, +getspent_next_file_plususer (struct spwd *result, char *buffer, size_t buflen) { struct parser_data *data = (void *) buffer; @@ -584,11 +584,11 @@ getspent_next_file_plususer (struct spwd *result, char *buffer, int parse_res; char *p; size_t plen; - + memset (&pwd, '\0', sizeof (struct spwd)); - + copy_spwd_changes (&pwd, result, NULL, 0); - + plen = spwd_need_buflen (&pwd); if (plen > buflen) { @@ -597,19 +597,19 @@ getspent_next_file_plususer (struct spwd *result, char *buffer, } p = buffer + (buflen - plen); buflen -= plen; - + if (use_nisplus) /* Do the NIS+ query here */ { nis_result *res; char buf[strlen (result->sp_namp) + 24]; - + sprintf(buf, "[name=%s],passwd.org_dir", &result->sp_namp[1]); res = nis_list(buf, EXPAND_NAME, NULL, NULL); if (niserr2nss (res->status) != NSS_STATUS_SUCCESS) { enum nss_status status = niserr2nss (res->status); - + nis_freeresult (res); return status; } @@ -621,22 +621,22 @@ getspent_next_file_plususer (struct spwd *result, char *buffer, char *domain; char *outval; int outvallen; - + if (yp_get_default_domain (&domain) != YPERR_SUCCESS) return NSS_STATUS_TRYAGAIN; - + if (yp_match (domain, "passwd.byname", &result->sp_namp[1], strlen (result->sp_namp) - 1, &outval, &outvallen) != YPERR_SUCCESS) return NSS_STATUS_TRYAGAIN; - p = strncpy (buffer, outval, + p = strncpy (buffer, outval, buflen < outvallen ? buflen : outvallen); free (outval); while (isspace (*p)) p++; parse_res = _nss_files_parse_spent (p, result, data, buflen); } - + if (parse_res) { copy_spwd_changes (result, &pwd, p, plen); @@ -660,8 +660,7 @@ getspent_next_file (struct spwd *result, ent_t *ent, struct parser_data *data = (void *) buffer; while (1) { - char *p, *p2; - size_t p2len; + char *p; do { @@ -676,10 +675,10 @@ getspent_next_file (struct spwd *result, ent_t *ent, while (isspace (*p)) ++p; } - while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ + while (*p == '\0' || *p == '#' /* Ignore empty and comment lines. */ /* Parse the line. If it is invalid, loop to get the next line of the file to parse. */ - !_nss_files_parse_spent (p, result, data, buflen)); + || !_nss_files_parse_spent (p, result, data, buflen)); if (result->sp_namp[0] != '+' && result->sp_namp[0] != '-') /* This is a real entry. */ @@ -689,15 +688,19 @@ getspent_next_file (struct spwd *result, ent_t *ent, if (result->sp_namp[0] == '-' && result->sp_namp[1] == '@' && result->sp_namp[2] != '\0') { - char *user, *host, *domain; - - setnetgrent (&result->sp_namp[2]); - while (getnetgrent (&host, &user, &domain)) + 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))) { if (user != NULL && user[0] != '-') blacklist_store_name (user, ent); } - endnetgrent (); + __internal_endnetgrent (&netgrdata); continue; } @@ -732,7 +735,7 @@ getspent_next_file (struct spwd *result, ent_t *ent, && result->sp_namp[1] != '@') { enum nss_status status; - + status = getspent_next_file_plususer (result, buffer, buflen); if (status == NSS_STATUS_SUCCESS) /* We found the entry. */ break; @@ -800,7 +803,7 @@ _nss_compat_getspent_r (struct spwd *pwd, char *buffer, size_t buflen) __nss_database_lookup ("shadow_compat", "passwd_compat", "nis", &ni); use_nisplus = (strcmp (ni->name, "nisplus") == 0); } - + /* Be prepared that the setspent function was not called before. */ if (ext_ent.stream == NULL) status = internal_setspent (&ext_ent); @@ -830,7 +833,7 @@ _nss_compat_getspnam_r (const char *name, struct spwd *pwd, __nss_database_lookup ("shadow_compat", "passwd_compat", "nis", &ni); use_nisplus = (strcmp (ni->name, "nisplus") == 0); } - + status = internal_setspent (&ent); if (status != NSS_STATUS_SUCCESS) return status; @@ -890,16 +893,19 @@ blacklist_store_name (const char *name, ent_t *ent) return; } -/* returns TRUE if ent->blacklist contains name, else FALSE */ +/* Returns TRUE if ent->blacklist contains name, else FALSE. */ static bool_t in_blacklist (const char *name, int namelen, ent_t *ent) { char buf[namelen + 3]; + char *cp; if (ent->blacklist.data == NULL) return FALSE; - stpcpy (stpcpy (stpcpy (buf, "|"), name), "|"); + buf[0] = '|'; + cp = stpcpy (&buf[1], name); + *cp++= '|'; + *cp = '\0'; return strstr (ent->blacklist.data, buf) != NULL; } - |