diff options
author | Ulrich Drepper <drepper@redhat.com> | 1997-07-22 00:10:33 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1997-07-22 00:10:33 +0000 |
commit | 60c966358ed6fa6ce3ded5426f46232cbfd8e0fd (patch) | |
tree | 2edfd4ad681692a2dbfdfcabaead5bca25ed2be5 /nis | |
parent | 907a1bacf996264c3197342cfc565b1d4f840bfb (diff) | |
download | glibc-60c966358ed6fa6ce3ded5426f46232cbfd8e0fd.tar.gz |
Update.
1997-07-22 01:35 Ulrich Drepper <drepper@cygnus.com>
* Makerules (+make-deps): Use $(CFLAGS) in run of $(+mkdep) so
that optimizing is also selected for dependency generation.
* configure.in: Add machine description for TI c[34]x.
* inet/Makefile (routines): Remove ntohl and ntohs.
* inet/netinet/in.h: Use optimized version of hton? and ntoh?
for little endian machines.
* sysdeps/alpha/ntohl.s: Removed.
* sysdeps/alpha/ntohs.s: Removed.
* sysdeps/generic/ntohl.c: Removed.
* sysdeps/generic/ntohs.c: Removed.
* sysdeps/generic/htonl.c: Add aliases for ntohl.
* sysdeps/vax/htonl.s: Likewise.
* sysdeps/generic/htons.c: Add aliases for ntohs.
* sysdeps/vax/htons.s: Likewise.
* sysdeps/vax/ntohl.s: Removed.
* sysdeps/vax/ntohs.s: Removed.
* sysdeps/generic/bits/htontoh.h: New file.
* sysdeps/i386/htonl.S: New file.
* sysdeps/i386/htons.S: New file.
* sysdeps/i386/i486/htonl.S: New file.
* sysdeps/i386/fpu/bits/mathinline.h: Correct and optimized compare
macros.
* sysdeps/mips/dl-machine.h: Remove mips64 dependent parts.
* sysdeps/mips/mips64/dl-machine.h: New file.
* sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Don't install
syscall-list.h.
1997-07-12 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* libc.map: Add missing symbol _obstack.
1997-07-14 08:22 H.J. Lu <hjl@gnu.ai.mit.edu>
* sysdeps/mips/rtld-parms: New.
* sysdeps/unix/sysv/linux/mips/lxstat.h: Moved to
* sysdeps/unix/sysv/linux/mips/lxstat.c: ...this.
* sysdeps/unix/sysv/linux/mips/sgidef.h: Moved to
* sysdeps/unix/sysv/linux/mips/sgidefs.h: ...this.
* sysdeps/generic/dl-sysdep.c (_start): Change to ENTRY_POINT.
1997-07-17 08:39 H.J. Lu <hjl@gnu.ai.mit.edu>
* sysdeps/mips/dl-machine.h: Remove extra stuff.
1997-07-06 07:18 Geoff Keating <geoffk@ozemail.com.au>
* sysdeps/powerpc/bits/endian.h: Handle multiple endianess.
* stdlib/grouping.h: Suppress gcc warning about testing
unsigned char for less-than-zero.
* stdio-common/printf_fp.c: Likewise.
* stdio-common/vfprintf.c: Likewise.
* sysdeps/powerpc/add_n.s: New file.
* sysdeps/powerpc/sub_n.s: New file.
* sysdeps/powerpc/lshift.s: Ported XCOFF->ELF (from GMP).
* sysdeps/powerpc/mul_1.s: Ported XCOFF->ELF (from GMP).
* sysdeps/powerpc/addmul_1.s: Ported XCOFF->ELF (from GMP).
* sysdeps/powerpc/submul_1.s: Ported XCOFF->ELF (from GMP).
* sysdeps/powerpc/rshift.s: Ported XCOFF->ELF (from GMP).
* math/libm-test.c (cos_test, sin_test, sincos_test): Use
precomputed pi/6 rather than having gcc calculate it, otherwise
tests give inaccurate result due to inaccurate input.
* math/libm.map: Add __fe_*_env constants to list of exported
symbols.
* sysdeps/libm-ieee754/s_isinf.c: Simplify, make faster.
* sysdeps/libm-ieee754/s_isinff.c: Simplify, make faster.
* sysdeps/libm-ieee754/s_atan2f.c: Correct value of pi to be correct
round-to-nearest value.
* sysdeps/libm-ieee754/e_log.c: Make sure exceptions are raised.
* sysdeps/libm-ieee754/e_log10.c: Likewise.
* sysdeps/libm-ieee754/e_log10f.c: Likewise.
* sysdeps/libm-ieee754/e_logf.c: Likewise.
* sysdeps/libm-ieee754/s_log1p.c: Likewise. Also use correct -Inf.
* sysdeps/libm-ieee754/s_log1pf.c: Likewise. Also use correct -Inf.
* sysdeps/libm-ieee754/s_log2.c: Likewise.
* sysdeps/libm-ieee754/s_log2f.c: Likewise.
1997-07-15 21:54 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* nis/nss_compat/compat-grp.c: Fix "buffer to small" problems
and memory leaks.
* nis/nss_compat/compat-pwd.c: Likewise.
* nis/nss_compat/compat-spwd.c: Likewise.
* nis/nss_nis/nis-alias.c: Likewise.
* nis/nss_nis/nis-ethers.c: Likewise.
* nis/nss_nis/nis-grp.c: Likewise.
* nis/nss_nis/nis-hosts.c: Likewise.
* nis/nss_nis/nis-network.c: Likewise.
* nis/nss_nis/nis-proto.c: Likewise.
* nis/nss_nis/nis-pwd.c: Likewise.
* nis/nss_nis/nis-rpc.c: Likewise.
* nis/nss_nis/nis-service.c: Likewise.
* nis/nss_nis/nis-spwd.c: Likewise.
* nis/nss_nisplus-alias.c: Likewise.
* nis/nss_nisplus-ethers.c: Likewise.
* nis/nss_nisplus-grp.c: Likewise.
* nis/nss_nisplus-hosts.c: Likewise.
* nis/nss_nisplus-netgrp.c: Likewise.
* nis/nss_nisplus-network.c: Likewise.
* nis/nss_nisplus-proto.c: Likewise.
* nis/nss_nisplus-pwd.c: Likewise.
* nis/nss_nisplus-rpc.c: Likewise.
* nis/nss_nisplus-service.c: Likewise.
* nis/nss_nisplus-spwd.c: Likewise.
* nis/nss_nisplus-parse.c: If buffer to small, give -1 back.
1997-07-20 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* sysdeps/m68k/dl-machine.h (elf_machine_rela): Mention program
name in warning message.
* sysdeps/powerpc/dl-machine.h (elf_machine_rela): Likewise.
* sysdeps/sparc/dl-machine.h (elf_machine_rela): Likewise.
* sysdeps/sparc64/dl-machine.h (elf_machine_rela): Likewise.
* sysdeps/i386/dl-machine.h (elf_machine_rel): Print program name
first.
1997-07-20 19:33 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
* libc.map: Add _null_auth and _seterr_reply.
* sunrpc/clnt_udp.c (clntudp_call): If xargs is NULL, don't encode it.
Diffstat (limited to 'nis')
25 files changed, 645 insertions, 334 deletions
diff --git a/nis/nss_compat/compat-grp.c b/nis/nss_compat/compat-grp.c index 59165ea590..9726784b2d 100644 --- a/nis/nss_compat/compat-grp.c +++ b/nis/nss_compat/compat-grp.c @@ -218,6 +218,10 @@ getgrent_next_nis (struct group *result, ent_t *ent, char *buffer, do { + char *save_oldkey; + int save_oldlen; + bool_t save_nis_first; + if (ent->nis_first) { if (yp_first (domain, "group.byname", &outkey, &outkeylen, @@ -226,7 +230,9 @@ getgrent_next_nis (struct group *result, ent_t *ent, char *buffer, ent->nis = 0; return NSS_STATUS_UNAVAIL; } - + save_oldkey = ent->oldkey; + save_oldlen = ent->oldkeylen; + save_nis_first = TRUE; ent->oldkey = outkey; ent->oldkeylen = outkeylen; ent->nis_first = FALSE; @@ -241,7 +247,9 @@ getgrent_next_nis (struct group *result, ent_t *ent, char *buffer, return NSS_STATUS_NOTFOUND; } - free (ent->oldkey); + save_oldkey = ent->oldkey; + save_oldlen = ent->oldkeylen; + save_nis_first = FALSE; ent->oldkey = outkey; ent->oldkeylen = outkeylen; } @@ -255,8 +263,21 @@ 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 = _nss_files_parse_grent (p, result, data, buflen)) == -1) + { + free (ent->oldkey); + ent->oldkey = save_oldkey; + ent->oldkeylen = save_oldlen; + ent->nis_first = save_nis_first; + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } + else + { + if (!save_nis_first) + free (save_oldkey); + } + 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 */ @@ -274,8 +295,13 @@ getgrent_next_nisplus (struct group *result, ent_t *ent, char *buffer, do { + nis_result *save_oldres; + bool_t save_nis_first; + if (ent->nis_first) { + save_oldres = ent->result; + save_nis_first = TRUE; ent->result = nis_first_entry(grptable); if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS) { @@ -288,8 +314,9 @@ getgrent_next_nisplus (struct group *result, ent_t *ent, char *buffer, { nis_result *res; + save_oldres = ent->result; + save_nis_first = FALSE; res = nis_next_entry(grptable, &ent->result->cookie); - nis_freeresult (ent->result); ent->result = res; if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS) { @@ -297,8 +324,21 @@ getgrent_next_nisplus (struct group *result, ent_t *ent, char *buffer, return niserr2nss (ent->result->status); } } - parse_res = _nss_nisplus_parse_grent (ent->result, 0, result, buffer, - buflen); + if ((parse_res = _nss_nisplus_parse_grent (ent->result, 0, result, + buffer, buflen)) == -1) + { + nis_freeresult (ent->result); + ent->result = save_oldres; + ent->nis_first = save_nis_first; + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } + else + { + if (!save_nis_first) + nis_freeresult (save_oldres); + } + 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 */ @@ -330,7 +370,13 @@ getgrent_next_file_plusgroup (struct group *result, char *buffer, nis_freeresult (res); return status; } - parse_res = _nss_nisplus_parse_grent (res, 0, result, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_grent (res, 0, result, buffer, + buflen)) == -1) + { + __set_errno (ERANGE); + nis_freeresult (res); + return NSS_STATUS_TRYAGAIN; + } nis_freeresult (res); } else /* Use NIS */ @@ -350,7 +396,11 @@ getgrent_next_file_plusgroup (struct group *result, char *buffer, free (outval); while (isspace (*p)) p++; - parse_res = _nss_files_parse_grent (p, result, data, buflen); + if ((parse_res = _nss_files_parse_grent (p, result, data, buflen)) == -1) + { + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } } if (parse_res) @@ -368,13 +418,24 @@ getgrent_next_file (struct group *result, ent_t *ent, struct parser_data *data = (void *) buffer; while (1) { + fpos_t pos; + int parse_res = 0; char *p; do { + fgetpos (ent->stream, &pos); p = fgets (buffer, buflen, ent->stream); if (p == NULL) - return NSS_STATUS_NOTFOUND; + { + if (feof (ent->stream)) + return NSS_STATUS_NOTFOUND; + else + { + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } + } /* Terminate the line for any case. */ buffer[buflen - 1] = '\0'; @@ -383,11 +444,18 @@ getgrent_next_file (struct group *result, ent_t *ent, while (isspace (*p)) ++p; } - /* Ignore empty and comment lines. */ - while (*p == '\0' || *p == '#' || + 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_grent (p, result, data, buflen)); + !(parse_res = _nss_files_parse_grent (p, result, data, buflen))); + + if (parse_res == -1) + { + /* The parser ran out of space. */ + fsetpos (ent->stream, &pos); + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } if (result->gr_name[0] != '+' && result->gr_name[0] != '-') /* This is a real entry. */ diff --git a/nis/nss_compat/compat-pwd.c b/nis/nss_compat/compat-pwd.c index 0d0f2a6c33..af1267922c 100644 --- a/nis/nss_compat/compat-pwd.c +++ b/nis/nss_compat/compat-pwd.c @@ -272,6 +272,9 @@ internal_endpwent (ent_t *ent) ent->stream = NULL; } + if (ent->netgroup) + __internal_endnetgrent (&ent->netgrdata); + ent->nis = ent->first = ent->netgroup = 0; if (ent->oldkey != NULL) @@ -303,9 +306,6 @@ _nss_compat_endpwent (void) __libc_lock_lock (lock); - if (ext_ent.netgroup) - __internal_endnetgrent (&ext_ent.netgrdata); - result = internal_endpwent (&ext_ent); __libc_lock_unlock (lock); @@ -339,6 +339,10 @@ getpwent_next_nis_netgr (struct passwd *result, ent_t *ent, char *group, while (1) { + char *saved_cursor; + int parse_res; + + saved_cursor = ent->netgrdata.cursor; status = __internal_getnetgrent_r (&host, &user, &domain, &ent->netgrdata, buffer, buflen); if (status != 1) @@ -372,7 +376,13 @@ getpwent_next_nis_netgr (struct passwd *result, ent_t *ent, char *group, while (isspace (*p)) p++; free (outval); - if (_nss_files_parse_pwent (p, result, data, buflen)) + if ((parse_res = _nss_files_parse_pwent (p, result, data, buflen)) == -1) + { + ent->netgrdata.cursor = saved_cursor; + return NSS_STATUS_TRYAGAIN; + } + + if (parse_res) { copy_pwd_changes (result, &ent->pwd, p2, p2len); break; @@ -410,6 +420,9 @@ getpwent_next_nisplus_netgr (struct passwd *result, ent_t *ent, char *group, while (1) { + char *saved_cursor; + + saved_cursor = ent->netgrdata.cursor; status = __internal_getnetgrent_r (&host, &user, &domain, &ent->netgrdata, buffer, buflen); if (status != 1) @@ -419,13 +432,13 @@ getpwent_next_nisplus_netgr (struct passwd *result, ent_t *ent, char *group, give_pwd_free (&ent->pwd); return NSS_STATUS_RETURN; } - + if (user == NULL || user[0] == '-') continue; - + if (domain != NULL && strcmp (ypdomain, domain) != 0) continue; - + p2len = pwd_need_buflen (&ent->pwd); if (p2len > buflen) { @@ -444,7 +457,13 @@ getpwent_next_nisplus_netgr (struct passwd *result, ent_t *ent, char *group, nis_freeresult (nisres); continue; } - parse_res = _nss_nisplus_parse_pwent (nisres, result, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_pwent (nisres, result, buffer, + buflen)) == -1) + { + nis_freeresult (nisres); + ent->netgrdata.cursor = saved_cursor; + return NSS_STATUS_TRYAGAIN; + } nis_freeresult (nisres); if (parse_res) @@ -485,8 +504,14 @@ getpwent_next_nisplus (struct passwd *result, ent_t *ent, char *buffer, buflen -= p2len; do { + bool_t saved_first; + nis_result *saved_res; + if (ent->first) { + saved_first = TRUE; + saved_res = ent->result; + ent->result = nis_first_entry(pwdtable); if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS) { @@ -501,17 +526,32 @@ getpwent_next_nisplus (struct passwd *result, ent_t *ent, char *buffer, nis_result *res; res = nis_next_entry(pwdtable, &ent->result->cookie); - nis_freeresult (ent->result); + saved_res = ent->result; + saved_first = FALSE; ent->result = res; if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS) { ent->nis = 0; + nis_freeresult (saved_res); give_pwd_free (&ent->pwd); return niserr2nss (ent->result->status); } } - parse_res = _nss_nisplus_parse_pwent (ent->result, result, buffer, - buflen); + if ((parse_res = _nss_nisplus_parse_pwent (ent->result, result, buffer, + buflen)) == -1) + { + nis_freeresult (ent->result); + ent->result = saved_res; + ent->first = saved_first; + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } + else + { + if (!saved_first) + nis_freeresult (saved_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 */ @@ -549,6 +589,10 @@ getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer, buflen -= p2len; do { + bool_t saved_first; + char *saved_oldkey; + int saved_oldlen; + if (ent->first) { if (yp_first (domain, "passwd.byname", &outkey, &outkeylen, @@ -558,7 +602,10 @@ getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer, give_pwd_free (&ent->pwd); return NSS_STATUS_UNAVAIL; } - + + saved_first = TRUE; + saved_oldkey = ent->oldkey; + saved_oldlen = ent->oldkeylen; ent->oldkey = outkey; ent->oldkeylen = outkeylen; ent->first = FALSE; @@ -574,7 +621,9 @@ getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer, return NSS_STATUS_NOTFOUND; } - free (ent->oldkey); + saved_first = FALSE; + saved_oldkey = ent->oldkey; + saved_oldlen = ent->oldkeylen; ent->oldkey = outkey; ent->oldkeylen = outkeylen; } @@ -587,7 +636,20 @@ getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer, while (isspace (*p)) ++p; - parse_res = _nss_files_parse_pwent (p, result, data, buflen); + if ((parse_res = _nss_files_parse_pwent (p, result, data, buflen)) == -1) + { + free (ent->oldkey); + ent->oldkey = saved_oldkey; + ent->oldkeylen = saved_oldlen; + ent->first = saved_first; + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } + else + { + if (!saved_first) + free (saved_oldkey); + } if (parse_res && in_blacklist (result->pw_name, strlen (result->pw_name), ent)) parse_res = 0; @@ -637,7 +699,13 @@ getpwent_next_file_plususer (struct passwd *result, char *buffer, nis_freeresult (res); return status; } - parse_res = _nss_nisplus_parse_pwent (res, result, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_pwent (res, result, buffer, + buflen)) == -1) + { + nis_freeresult (res); + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } nis_freeresult (res); } else /* Use NIS */ @@ -645,10 +713,10 @@ 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) @@ -658,10 +726,14 @@ getpwent_next_file_plususer (struct passwd *result, char *buffer, free (outval); while (isspace (*p)) p++; - parse_res = _nss_files_parse_pwent (p, result, data, buflen); + if ((parse_res = _nss_files_parse_pwent (p, result, data, buflen)) == -1) + { + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } } - if (parse_res) + if (parse_res > 0) { copy_pwd_changes (result, &pwd, p, plen); give_pwd_free (&pwd); @@ -684,10 +756,13 @@ getpwent_next_file (struct passwd *result, ent_t *ent, struct parser_data *data = (void *) buffer; while (1) { + fpos_t pos; char *p; + int parse_res; do { + fgetpos (ent->stream, &pos); p = fgets (buffer, buflen, ent->stream); if (p == NULL) return NSS_STATUS_NOTFOUND; @@ -702,7 +777,15 @@ getpwent_next_file (struct passwd *result, ent_t *ent, 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_pwent (p, result, data, buflen)); + !(parse_res = _nss_files_parse_pwent (p, result, data, buflen))); + + if (parse_res == -1) + { + /* The parser ran out of space. */ + fsetpos (ent->stream, &pos); + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } if (result->pw_name[0] != '+' && result->pw_name[0] != '-') /* This is a real entry. */ diff --git a/nis/nss_compat/compat-spwd.c b/nis/nss_compat/compat-spwd.c index 4199baf202..61a703c1ea 100644 --- a/nis/nss_compat/compat-spwd.c +++ b/nis/nss_compat/compat-spwd.c @@ -292,6 +292,10 @@ getspent_next_nis_netgr (struct spwd *result, ent_t *ent, char *group, while (1) { + char *saved_cursor; + int parse_res; + + saved_cursor = ent->netgrdata.cursor; status = __internal_getnetgrent_r (&host, &user, &domain, &ent->netgrdata, buffer, buflen); if (status != 1) @@ -301,10 +305,10 @@ getspent_next_nis_netgr (struct spwd *result, ent_t *ent, char *group, give_spwd_free (&ent->pwd); return NSS_STATUS_RETURN; } - + if (user == NULL || user[0] == '-') continue; - + if (domain != NULL && strcmp (ypdomain, domain) != 0) continue; @@ -325,7 +329,13 @@ getspent_next_nis_netgr (struct spwd *result, ent_t *ent, char *group, while (isspace (*p)) p++; free (outval); - if (_nss_files_parse_spent (p, result, data, buflen)) + if ((parse_res = _nss_files_parse_spent (p, result, data, buflen)) == -1) + { + ent->netgrdata.cursor = saved_cursor; + return NSS_STATUS_TRYAGAIN; + } + + if (parse_res) { copy_spwd_changes (result, &ent->pwd, p2, p2len); break; @@ -363,6 +373,9 @@ getspent_next_nisplus_netgr (struct spwd *result, ent_t *ent, char *group, while (1) { + char *saved_cursor; + + saved_cursor = ent->netgrdata.cursor; status = __internal_getnetgrent_r (&host, &user, &domain, &ent->netgrdata, buffer, buflen); if (status != 1) @@ -397,7 +410,12 @@ getspent_next_nisplus_netgr (struct spwd *result, ent_t *ent, char *group, nis_freeresult (nisres); continue; } - parse_res = _nss_nisplus_parse_spent (nisres, result, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_spent (nisres, result, buffer, + buflen)) == -1) + { + nis_freeresult (nisres); + return NSS_STATUS_TRYAGAIN; + } nis_freeresult (nisres); if (parse_res) @@ -438,8 +456,14 @@ getspent_next_nisplus (struct spwd *result, ent_t *ent, char *buffer, buflen -= p2len; do { + bool_t saved_first; + nis_result *saved_res; + if (ent->first) { + saved_first = TRUE; + saved_res = ent->result; + ent->result = nis_first_entry(pwdtable); if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS) { @@ -453,18 +477,33 @@ getspent_next_nisplus (struct spwd *result, ent_t *ent, char *buffer, { nis_result *res; + saved_first = FALSE; + saved_res = ent->result; + res = nis_next_entry(pwdtable, &ent->result->cookie); - nis_freeresult (ent->result); ent->result = res; if (niserr2nss (ent->result->status) != NSS_STATUS_SUCCESS) { + nis_freeresult (saved_res); ent->nis = 0; give_spwd_free (&ent->pwd); return niserr2nss (ent->result->status); } } - parse_res = _nss_nisplus_parse_spent (ent->result, result, buffer, - buflen); + if ((parse_res = _nss_nisplus_parse_spent (ent->result, result, buffer, + buflen)) == -1) + { + ent->first = saved_first; + nis_freeresult (ent->result); + ent->result = saved_res; + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } + else + { + if (!saved_first) + nis_freeresult (saved_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 */ @@ -503,6 +542,10 @@ getspent_next_nis (struct spwd *result, ent_t *ent, buflen -= p2len; do { + bool_t saved_first; + char *saved_oldkey; + int saved_oldlen; + if (ent->first) { if (yp_first (domain, "shadow.byname", &outkey, &outkeylen, @@ -512,7 +555,9 @@ getspent_next_nis (struct spwd *result, ent_t *ent, give_spwd_free (&ent->pwd); return NSS_STATUS_UNAVAIL; } - + saved_first = TRUE; + saved_oldkey = ent->oldkey; + saved_oldlen = ent->oldkeylen; ent->oldkey = outkey; ent->oldkeylen = outkeylen; ent->first = FALSE; @@ -528,7 +573,9 @@ getspent_next_nis (struct spwd *result, ent_t *ent, return NSS_STATUS_NOTFOUND; } - free (ent->oldkey); + saved_first = FALSE; + saved_oldkey = ent->oldkey; + saved_oldlen = ent->oldkeylen; ent->oldkey = outkey; ent->oldkeylen = outkeylen; } @@ -541,7 +588,20 @@ getspent_next_nis (struct spwd *result, ent_t *ent, while (isspace (*p)) ++p; - parse_res = _nss_files_parse_spent (p, result, data, buflen); + if ((parse_res = _nss_files_parse_spent (p, result, data, buflen)) == -1) + { + free (ent->oldkey); + ent->oldkey = saved_oldkey; + ent->oldkeylen = saved_oldlen; + ent->first = saved_first; + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } + else + { + if (!saved_first) + free (saved_oldkey); + } if (parse_res && in_blacklist (result->sp_namp, strlen (result->sp_namp), ent)) parse_res = 0; @@ -591,7 +651,12 @@ getspent_next_file_plususer (struct spwd *result, char *buffer, nis_freeresult (res); return status; } - parse_res = _nss_nisplus_parse_spent (res, result, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_spent (res, result, buffer, + buflen)) == -1) + { + nis_freeresult (res); + return NSS_STATUS_TRYAGAIN; + } nis_freeresult (res); } else /* Use NIS */ @@ -612,7 +677,8 @@ getspent_next_file_plususer (struct spwd *result, char *buffer, free (outval); while (isspace (*p)) p++; - parse_res = _nss_files_parse_spent (p, result, data, buflen); + if ((parse_res = _nss_files_parse_spent (p, result, data, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; } if (parse_res) @@ -638,10 +704,13 @@ getspent_next_file (struct spwd *result, ent_t *ent, struct parser_data *data = (void *) buffer; while (1) { + fpos_t pos; + int parse_res = 0; char *p; do { + fgetpos (ent->stream, &pos); p = fgets (buffer, buflen, ent->stream); if (p == NULL) return NSS_STATUS_NOTFOUND; @@ -656,8 +725,17 @@ getspent_next_file (struct spwd *result, ent_t *ent, 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)); + || !(parse_res = _nss_files_parse_spent (p, result, data, + buflen))); + if (parse_res == -1) + { + /* The parser ran out of space. */ + fsetpos (ent->stream, &pos); + __set_errno (ERANGE); + return NSS_STATUS_TRYAGAIN; + } + if (result->sp_namp[0] != '+' && result->sp_namp[0] != '-') /* This is a real entry. */ break; diff --git a/nis/nss_nis/nis-alias.c b/nis/nss_nis/nis-alias.c index 80c49ff5dd..e187716bb0 100644 --- a/nis/nss_nis/nis-alias.c +++ b/nis/nss_nis/nis-alias.c @@ -184,9 +184,10 @@ internal_nis_getaliasent_r (struct aliasent *alias, char *buffer, ++p; free (result); - parse_res = _nss_nis_parse_aliasent (outkey, p, alias, buffer, buflen); - if (parse_res == -1) + if ((parse_res = _nss_nis_parse_aliasent (outkey, p, alias, + buffer, buflen)) == -1) { + free (outkey); __set_errno (ERANGE); return NSS_STATUS_TRYAGAIN; } @@ -258,12 +259,12 @@ _nss_nis_getaliasbyname_r (const char *name, struct aliasent *alias, free (result); alias->alias_local = 0; - parse_res = _nss_nis_parse_aliasent (name, p, alias, buffer, buflen); - if (parse_res == -1) + if ((parse_res = _nss_nis_parse_aliasent (name, p, alias, buffer, + buflen)) == -1) return NSS_STATUS_TRYAGAIN; + + if (parse_res) + return NSS_STATUS_SUCCESS; else - if (parse_res == 0) - return NSS_STATUS_NOTFOUND; - else - return NSS_STATUS_SUCCESS; + return NSS_STATUS_NOTFOUND; } diff --git a/nis/nss_nis/nis-ethers.c b/nis/nss_nis/nis-ethers.c index 149910bfab..e54262409c 100644 --- a/nis/nss_nis/nis-ethers.c +++ b/nis/nss_nis/nis-ethers.c @@ -159,17 +159,16 @@ internal_nis_getetherent_r (struct ether *eth, char *buffer, size_t buflen) if (next == NULL) return NSS_STATUS_NOTFOUND; p = strcpy (buffer, next->val); - next = next->next; while (isspace (*p)) ++p; - parse_res = _nss_files_parse_etherent (p, eth, data, buflen); - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; + if ((parse_res = _nss_files_parse_etherent (p, eth, data, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; + next = next->next; } while (!parse_res); - + return NSS_STATUS_SUCCESS; } @@ -228,15 +227,11 @@ _nss_nis_gethostton_r (const char *name, struct ether *eth, ++p; free (result); - parse_res = _nss_files_parse_etherent (p, eth, data, buflen); + if ((parse_res = _nss_files_parse_etherent (p, eth, data, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; if (!parse_res) - { - if (errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; - } + return NSS_STATUS_NOTFOUND; else return NSS_STATUS_SUCCESS; } @@ -291,15 +286,11 @@ _nss_nis_getntohost_r (struct ether_addr *addr, struct ether *eth, ++p; free (result); - parse_res = _nss_files_parse_etherent (p, eth, data, buflen); + if ((parse_res = _nss_files_parse_etherent (p, eth, data, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; if (!parse_res) - { - if (errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; - } + return NSS_STATUS_NOTFOUND; else return NSS_STATUS_SUCCESS; } diff --git a/nis/nss_nis/nis-grp.c b/nis/nss_nis/nis-grp.c index 9577499670..7897e21881 100644 --- a/nis/nss_nis/nis-grp.c +++ b/nis/nss_nis/nis-grp.c @@ -121,9 +121,11 @@ internal_nis_getgrent_r (struct group *grp, char *buffer, size_t buflen) ++p; free (result); - parse_res = _nss_files_parse_grent (p, grp, data, buflen); - if (parse_res < 1 && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; + if ((parse_res = _nss_files_parse_grent (p, grp, data, buflen)) == -1) + { + free (outkey); + return NSS_STATUS_TRYAGAIN; + } free (oldkey); oldkey = outkey; @@ -190,17 +192,13 @@ _nss_nis_getgrnam_r (const char *name, struct group *grp, ++p; free (result); - parse_res = _nss_files_parse_grent (p, grp, data, buflen); + if ((parse_res = _nss_files_parse_grent (p, grp, data, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; - if (parse_res < 1) - { - if (errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; - } - else + if (parse_res) return NSS_STATUS_SUCCESS; + else + return NSS_STATUS_NOTFOUND; } enum nss_status @@ -241,15 +239,11 @@ _nss_nis_getgrgid_r (gid_t gid, struct group *grp, ++p; free (result); - parse_res = _nss_files_parse_grent (p, grp, data, buflen); + if ((parse_res = _nss_files_parse_grent (p, grp, data, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; - if (parse_res < 1) - { - if (errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; - } - else + if (parse_res) return NSS_STATUS_SUCCESS; + else + return NSS_STATUS_NOTFOUND; } diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c index d26b4f5ccc..da7cef5ada 100644 --- a/nis/nss_nis/nis-hosts.c +++ b/nis/nss_nis/nis-hosts.c @@ -199,9 +199,9 @@ internal_nis_gethostent_r (struct hostent *host, char *buffer, ++p; free (result); - parse_res = parse_line (p, host, data, buflen); - if (!parse_res && errno == ERANGE) + if ((parse_res = parse_line (p, host, data, buflen)) == -1) { + free (outkey); *h_errnop = NETDB_INTERNAL;; return NSS_STATUS_TRYAGAIN; } @@ -287,9 +287,9 @@ _nss_nis_gethostbyname2_r (const char *name, int af, struct hostent *host, parse_res = parse_line (p, host, data, buflen); - if (!parse_res || host->h_addrtype != af) + if (parse_res < 1 || host->h_addrtype != af) { - if (!parse_res && errno == ERANGE) + if (parse_res == -1) { *h_errnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; @@ -377,10 +377,9 @@ _nss_nis_gethostbyaddr_r (char *addr, int addrlen, int type, free (result); parse_res = parse_line (p, host, data, buflen); - - if (!parse_res) + if (parse_res < 1) { - if (errno == ERANGE) + if (parse_res == -1) { *h_errnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; diff --git a/nis/nss_nis/nis-network.c b/nis/nss_nis/nis-network.c index 284e479401..c17ba81a62 100644 --- a/nis/nss_nis/nis-network.c +++ b/nis/nss_nis/nis-network.c @@ -126,9 +126,9 @@ internal_nis_getnetent_r (struct netent *net, char *buffer, size_t buflen, ++p; free (result); - parse_res = _nss_files_parse_netent (p, net, data, buflen); - if (!parse_res && errno == ERANGE) + if ((parse_res = _nss_files_parse_netent (p, net, data, buflen)) == -1) { + free (outkey); *herrnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } @@ -206,10 +206,10 @@ _nss_nis_getnetbyname_r (const char *name, struct netent *net, parse_res = _nss_files_parse_netent (p, net, data, buflen); - if (!parse_res) + if (parse_res < 1) { *herrnop = NETDB_INTERNAL; - if (errno == ERANGE) + if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; @@ -286,10 +286,10 @@ _nss_nis_getnetbyaddr_r (unsigned long addr, int type, struct netent *net, parse_res = _nss_files_parse_netent (p, net, data, buflen); - if (!parse_res) + if (parse_res < 1) { *herrnop = NETDB_INTERNAL; - if (errno == ERANGE) + if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; diff --git a/nis/nss_nis/nis-proto.c b/nis/nss_nis/nis-proto.c index ceed40e036..eb09bb4ec7 100644 --- a/nis/nss_nis/nis-proto.c +++ b/nis/nss_nis/nis-proto.c @@ -152,17 +152,17 @@ internal_nis_getprotoent_r (struct protoent *proto, if (next == NULL) return NSS_STATUS_NOTFOUND; p = strcpy (buffer, next->val); - next = next->next; while (isspace (*p)) ++p; - parse_res = _nss_files_parse_protoent (p, proto, data, buflen); - if (!parse_res && errno == ERANGE) + if ((parse_res = _nss_files_parse_protoent (p, proto, data, + buflen)) == -1) return NSS_STATUS_TRYAGAIN; + next = next->next; } while (!parse_res); - + return NSS_STATUS_SUCCESS; } @@ -221,17 +221,13 @@ _nss_nis_getprotobyname_r (const char *name, struct protoent *proto, ++p; free (result); - parse_res = _nss_files_parse_protoent (p, proto, data, buflen); + if ((parse_res = _nss_files_parse_protoent (p, proto, data, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; - if (!parse_res) - { - if (errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; - } - else + if (parse_res) return NSS_STATUS_SUCCESS; + else + return NSS_STATUS_NOTFOUND; } enum nss_status @@ -272,15 +268,11 @@ _nss_nis_getprotobynumber_r (int number, struct protoent *proto, ++p; free (result); - parse_res = _nss_files_parse_protoent (p, proto, data, buflen); + if ((parse_res = _nss_files_parse_protoent (p, proto, data, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; - if (!parse_res) - { - if (errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; - } - else + if (parse_res) return NSS_STATUS_SUCCESS; + else + return NSS_STATUS_NOTFOUND; } diff --git a/nis/nss_nis/nis-pwd.c b/nis/nss_nis/nis-pwd.c index 39c2948b65..f693db17ea 100644 --- a/nis/nss_nis/nis-pwd.c +++ b/nis/nss_nis/nis-pwd.c @@ -121,16 +121,18 @@ internal_nis_getpwent_r (struct passwd *pwd, char *buffer, size_t buflen) ++p; free (result); - parse_res = _nss_files_parse_pwent (p, pwd, data, buflen); - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; + if ((parse_res = _nss_files_parse_pwent (p, pwd, data, buflen)) == -1) + { + free (outkey); + return NSS_STATUS_TRYAGAIN; + } free (oldkey); oldkey = outkey; oldkeylen = keylen; new_start = 0; } - while (!parse_res); + while (parse_res < 1); return NSS_STATUS_SUCCESS; } @@ -192,9 +194,9 @@ _nss_nis_getpwnam_r (const char *name, struct passwd *pwd, parse_res = _nss_files_parse_pwent (p, pwd, data, buflen); - if (!parse_res) + if (parse_res < 1) { - if (errno == ERANGE) + if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; @@ -243,9 +245,9 @@ _nss_nis_getpwuid_r (uid_t uid, struct passwd *pwd, parse_res = _nss_files_parse_pwent (p, pwd, data, buflen); - if (!parse_res) + if (parse_res < 1) { - if (errno == ERANGE) + if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; diff --git a/nis/nss_nis/nis-rpc.c b/nis/nss_nis/nis-rpc.c index 073284865e..cd1f0db9b5 100644 --- a/nis/nss_nis/nis-rpc.c +++ b/nis/nss_nis/nis-rpc.c @@ -169,13 +169,12 @@ internal_nis_getrpcent_r (struct rpcent *rpc, char *buffer, size_t buflen, if (data->next == NULL) return NSS_STATUS_NOTFOUND; p = strcpy (buffer, data->next->val); - data->next = data->next->next; while (isspace (*p)) ++p; - parse_res = _nss_files_parse_rpcent (p, rpc, pdata, buflen); - if (!parse_res && errno == ERANGE) + if ((parse_res = _nss_files_parse_rpcent (p, rpc, pdata, buflen)) == -1) return NSS_STATUS_TRYAGAIN; + data->next = data->next->next; } while (!parse_res); @@ -286,9 +285,9 @@ _nss_nis_getrpcbynumber_r (int number, struct rpcent *rpc, parse_res = _nss_files_parse_rpcent (p, rpc, data, buflen); - if (!parse_res) + if (parse_res < 1) { - if (errno == ERANGE) + if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; diff --git a/nis/nss_nis/nis-service.c b/nis/nss_nis/nis-service.c index 054bc33169..5ec89c8677 100644 --- a/nis/nss_nis/nis-service.c +++ b/nis/nss_nis/nis-service.c @@ -169,13 +169,13 @@ internal_nis_getservent_r (struct servent *serv, char *buffer, if (data->next == NULL) return NSS_STATUS_NOTFOUND; p = strcpy (buffer, data->next->val); - data->next = data->next->next; - while (isspace (*p)) + while (isspace (*p)) ++p; - parse_res = _nss_files_parse_servent (p, serv, buffer, buflen); - if (!parse_res && errno == ERANGE) + if ((parse_res = _nss_files_parse_servent (p, serv, buffer, + buflen)) == -1) return NSS_STATUS_TRYAGAIN; + data->next = data->next->next; } while (!parse_res); diff --git a/nis/nss_nis/nis-spwd.c b/nis/nss_nis/nis-spwd.c index 21221fd7e5..0263f4e313 100644 --- a/nis/nss_nis/nis-spwd.c +++ b/nis/nss_nis/nis-spwd.c @@ -121,10 +121,12 @@ internal_nis_getspent_r (struct spwd *sp, char *buffer, size_t buflen) ++p; free (result); - parse_res = _nss_files_parse_spent (p, sp, data, buflen); - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - + if ((parse_res = _nss_files_parse_spent (p, sp, data, buflen)) == -1) + { + free (outkey); + return NSS_STATUS_TRYAGAIN; + } + free (oldkey); oldkey = outkey; oldkeylen = keylen; @@ -190,15 +192,11 @@ _nss_nis_getspnam_r (const char *name, struct spwd *sp, ++p; free (result); - parse_res = _nss_files_parse_spent (p, sp, data, buflen); + if ((parse_res = _nss_files_parse_spent (p, sp, data, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; - if (!parse_res) - { - if (errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; - } - else + if (parse_res) return NSS_STATUS_SUCCESS; + else + return NSS_STATUS_NOTFOUND; } diff --git a/nis/nss_nisplus/nisplus-alias.c b/nis/nss_nisplus/nisplus-alias.c index 660ba3c34a..0a16b3890f 100644 --- a/nis/nss_nisplus/nisplus-alias.c +++ b/nis/nss_nisplus/nisplus-alias.c @@ -87,7 +87,7 @@ _nss_nisplus_parse_aliasent (nis_result *result, unsigned long entry, /* The line is too long for our buffer. */ no_more_room: __set_errno (ERANGE); - return 0; + return -1; } else { @@ -214,8 +214,10 @@ internal_nisplus_getaliasent_r (struct aliasent *alias, if (next_entry >= result->objects.objects_len) return NSS_STATUS_NOTFOUND; - parse_res = _nss_nisplus_parse_aliasent (result, next_entry, alias, - buffer, buflen); + if ((parse_res = _nss_nisplus_parse_aliasent (result, next_entry, alias, + buffer, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; + ++next_entry; } while (!parse_res); @@ -247,9 +249,7 @@ _nss_nisplus_getaliasbyname_r (const char *name, struct aliasent *alias, if (_nss_create_tablename() != NSS_STATUS_SUCCESS) return NSS_STATUS_UNAVAIL; - if (name == NULL || strlen(name) > 8) - return NSS_STATUS_NOTFOUND; - else + if (name != NULL || strlen(name) <= 8) { nis_result *result; char buf[strlen (name) + 30 + tablename_len]; @@ -261,15 +261,12 @@ _nss_nisplus_getaliasbyname_r (const char *name, struct aliasent *alias, if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) return niserr2nss (result->status); - parse_res = _nss_nisplus_parse_aliasent (result, 0, alias, - buffer, buflen); + if ((parse_res = _nss_nisplus_parse_aliasent (result, 0, alias, + buffer, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; if (parse_res) return NSS_STATUS_SUCCESS; - - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; } + return NSS_STATUS_NOTFOUND; } diff --git a/nis/nss_nisplus/nisplus-ethers.c b/nis/nss_nisplus/nisplus-ethers.c index 7c07833ef4..d7c3720932 100644 --- a/nis/nss_nisplus/nisplus-ethers.c +++ b/nis/nss_nisplus/nisplus-ethers.c @@ -74,7 +74,7 @@ _nss_nisplus_parse_etherent (nis_result *result, struct etherent *ether, if (NISENTRYLEN (0, 0, result) +1 > room_left) { __set_errno (ERANGE); - return 0; + return -1; } strncpy (p, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result)); room_left -= (NISENTRYLEN (0, 0, result) +1); @@ -152,8 +152,11 @@ internal_nisplus_getetherent_r (struct etherent *ether, char *buffer, /* Get the next entry until we found a correct one. */ do { + nis_result *saved_result; + if (result == NULL) { + saved_result = NULL; result = nis_first_entry(tablename_val); if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) return niserr2nss (result->status); @@ -163,13 +166,28 @@ internal_nisplus_getetherent_r (struct etherent *ether, char *buffer, nis_result *res2; res2 = nis_next_entry(tablename_val, &result->cookie); - nis_freeresult (result); + saved_result = result; result = res2; if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) - return niserr2nss (result->status); + { + nis_freeresult (saved_result); + return niserr2nss (result->status); + } } - parse_res = _nss_nisplus_parse_etherent (result, ether, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_etherent (result, ether, buffer, + buflen)) == -1) + { + nis_freeresult (result); + result = saved_result; + return NSS_STATUS_TRYAGAIN; + } + else + { + if (saved_result != NULL) + nis_freeresult (saved_result); + } + } while (!parse_res); return NSS_STATUS_SUCCESS; @@ -200,9 +218,7 @@ _nss_nisplus_gethostton_r (const char *name, struct etherent *eth, if (_nss_create_tablename () != NSS_STATUS_SUCCESS) return NSS_STATUS_UNAVAIL; - if (name == NULL) - return NSS_STATUS_NOTFOUND; - else + if (name != NULL) { nis_result *result; char buf[strlen (name) + 40 + tablename_len]; @@ -212,18 +228,23 @@ _nss_nisplus_gethostton_r (const char *name, struct etherent *eth, result = nis_list(buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) - return niserr2nss (result->status); - - parse_res = _nss_nisplus_parse_etherent (result, eth, buffer, buflen); - + { + enum nss_status status = niserr2nss (result->status); + nis_freeresult (result); + return status; + } + + if ((parse_res = _nss_nisplus_parse_etherent (result, eth, buffer, + buflen)) == -1) + { + nis_freeresult (result); + return NSS_STATUS_TRYAGAIN; + } + if (parse_res) return NSS_STATUS_SUCCESS; - - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; } + return NSS_STATUS_NOTFOUND; } enum nss_status @@ -255,16 +276,22 @@ _nss_nisplus_getntohost_r (const struct ether_addr *addr, result = nis_list(buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) - return niserr2nss (result->status); - - parse_res = _nss_nisplus_parse_etherent (result, eth, buffer, buflen); + { + enum nss_status status = niserr2nss (result->status); + nis_freeresult (result); + return status; + } + if ((parse_res = _nss_nisplus_parse_etherent (result, eth, buffer, + buflen)) == -1) + { + nis_freeresult (result); + return NSS_STATUS_TRYAGAIN; + } + if (parse_res) return NSS_STATUS_SUCCESS; - - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; } + return NSS_STATUS_NOTFOUND; } + diff --git a/nis/nss_nisplus/nisplus-grp.c b/nis/nss_nisplus/nisplus-grp.c index f759f61ca0..08e9e040fe 100644 --- a/nis/nss_nisplus/nisplus-grp.c +++ b/nis/nss_nisplus/nisplus-grp.c @@ -117,8 +117,10 @@ internal_nisplus_getgrent_r (struct group *gr, char *buffer, size_t buflen) if (next_entry >= result->objects.objects_len) return NSS_STATUS_NOTFOUND; - parse_res = _nss_nisplus_parse_grent (result, next_entry, gr, - buffer, buflen); + if ((parse_res = _nss_nisplus_parse_grent (result, next_entry, gr, + buffer, buflen)) == -1) + return NSS_STATUS_TRYAGAIN; + ++next_entry; } while (!parse_res); @@ -170,16 +172,14 @@ _nss_nisplus_getgrnam_r (const char *name, struct group *gr, } parse_res = _nss_nisplus_parse_grent (result, 0, gr, buffer, buflen); - nis_freeresult (result); + if (parse_res == -1) + return NSS_STATUS_TRYAGAIN; if (parse_res) return NSS_STATUS_SUCCESS; - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + return NSS_STATUS_NOTFOUND; } } @@ -212,12 +212,12 @@ _nss_nisplus_getgrgid_r (const gid_t gid, struct group *gr, nis_freeresult (result); + if (parse_res == -1) + return NSS_STATUS_TRYAGAIN; + if (parse_res) return NSS_STATUS_SUCCESS; - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + return NSS_STATUS_NOTFOUND; } } diff --git a/nis/nss_nisplus/nisplus-hosts.c b/nis/nss_nisplus/nisplus-hosts.c index d4dda5964e..10f939e341 100644 --- a/nis/nss_nisplus/nisplus-hosts.c +++ b/nis/nss_nisplus/nisplus-hosts.c @@ -66,8 +66,9 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host, if (room_left < NISENTRYLEN (0, 2, result) + 1) { + no_more_room: __set_errno (ERANGE); - return 0; + return -1; } data = first_unused; @@ -96,10 +97,8 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host, room_left-=host->h_length; if (NISENTRYLEN (0, 0, result) + 1 > room_left) - { - __set_errno (ERANGE); - return 0; - } + goto no_more_room; + p = stpncpy (first_unused, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result)); *p = '\0'; @@ -114,10 +113,8 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host, if (strcmp (NISENTRYVAL (i, 1, result), host->h_name) != 0) { if (NISENTRYLEN (i, 1, result) + 2 > room_left) - { - __set_errno (ERANGE); - return 0; - } + goto no_more_room; + *p++ = ' '; p = stpncpy (p, NISENTRYVAL (i, 1, result), NISENTRYLEN (i, 1, result)); @@ -133,10 +130,8 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host, first_unused -= ((first_unused - (char *) 0) % __alignof__ (char *)); host->h_addr_list = (char **) first_unused; if (room_left < 2 * sizeof (char *)) - { - __set_errno (ERANGE); - return 0; - } + goto no_more_room; + room_left -= (2 * sizeof (char *)); host->h_addr_list[0] = data; host->h_addr_list[1] = NULL; @@ -154,10 +149,7 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host, break; if (room_left < sizeof (char *)) - { - __set_errno (ERANGE); - return 0; - } + goto no_more_room; room_left -= sizeof (char *); host->h_aliases[i] = line; @@ -174,9 +166,7 @@ _nss_nisplus_parse_hostent (nis_result *result, int af, struct hostent *host, else host->h_aliases[i+1] = NULL; } - return 1; - } static enum nss_status @@ -240,8 +230,11 @@ internal_nisplus_gethostent_r (struct hostent *host, char *buffer, /* Get the next entry until we found a correct one. */ do { + nis_result *saved_res; + if (result == NULL) { + saved_res = NULL; if (tablename_val == NULL) if (_nss_create_tablename() != NSS_STATUS_SUCCESS) return NSS_STATUS_UNAVAIL; @@ -249,9 +242,7 @@ internal_nisplus_gethostent_r (struct hostent *host, char *buffer, result = nis_first_entry(tablename_val); if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) { - int retval; - - retval = niserr2nss (result->status); + enum nss_status retval = niserr2nss (result->status); if (retval == NSS_STATUS_TRYAGAIN) { *herrnop = NETDB_INTERNAL; @@ -259,20 +250,21 @@ internal_nisplus_gethostent_r (struct hostent *host, char *buffer, } return retval; } - + } else { nis_result *res2; - + + saved_res = result; res2 = nis_next_entry(tablename_val, &result->cookie); - nis_freeresult (result); result = res2; if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) { - int retval; + enum nss_status retval= niserr2nss (result->status); - retval = niserr2nss (result->status); + nis_freeresult (result); + result = saved_res; if (retval == NSS_STATUS_TRYAGAIN) { *herrnop = NETDB_INTERNAL; @@ -281,20 +273,24 @@ internal_nisplus_gethostent_r (struct hostent *host, char *buffer, return retval; } } - + parse_res = _nss_nisplus_parse_hostent (result, AF_INET6, host, buffer, buflen); - if (!parse_res && errno != ERANGE) + if (parse_res < 1 && errno != ERANGE) parse_res = _nss_nisplus_parse_hostent (result, AF_INET, host, buffer, buflen); - if (!parse_res && errno == ERANGE) + if (parse_res < 1 && errno == ERANGE) { + nis_freeresult (result); + result = saved_res; *herrnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } - + if (saved_res != NULL) + nis_freeresult (saved_res); + } while (!parse_res); - + return NSS_STATUS_SUCCESS; } @@ -353,10 +349,10 @@ _nss_nisplus_gethostbyname2_r (const char *name, int af, struct hostent *host, else sprintf(buf, "[cname=%s],%s", NISENTRYVAL(0, 0, result), tablename_val); - + nis_freeresult (result); result = nis_list(buf, FOLLOW_PATH | FOLLOW_LINKS, NULL, NULL); - + retval = niserr2nss (result->status); if (retval != NSS_STATUS_SUCCESS) { @@ -373,12 +369,12 @@ _nss_nisplus_gethostbyname2_r (const char *name, int af, struct hostent *host, _nss_nisplus_parse_hostent (result, af, host, buffer, buflen); nis_freeresult (result); - - if (parse_res) + + if (parse_res > 0) return NSS_STATUS_SUCCESS; *herrnop = NETDB_INTERNAL; - if (!parse_res && errno == ERANGE) + if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; @@ -438,14 +434,13 @@ _nss_nisplus_gethostbyaddr_r (const char *addr, int addrlen, int type, parse_res = _nss_nisplus_parse_hostent (result, type, host, buffer, buflen); - nis_freeresult (result); - - if (parse_res) + + if (parse_res > 0) return NSS_STATUS_SUCCESS; - + *herrnop = NETDB_INTERNAL; - if (!parse_res && errno == ERANGE) + if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; diff --git a/nis/nss_nisplus/nisplus-netgrp.c b/nis/nss_nisplus/nisplus-netgrp.c index 670d0bb4ed..9c38539de8 100644 --- a/nis/nss_nisplus/nisplus-netgrp.c +++ b/nis/nss_nisplus/nisplus-netgrp.c @@ -80,7 +80,7 @@ _nss_nisplus_parse_netgroup (struct __netgrent *result, char *buffer, NISENTRYLEN (position, 4, data) + 6 > buflen) { __set_errno (ERANGE); - status = NSS_STATUS_UNAVAIL; + status = NSS_STATUS_TRYAGAIN; } else { diff --git a/nis/nss_nisplus/nisplus-network.c b/nis/nss_nisplus/nisplus-network.c index 183722633f..57362dba78 100644 --- a/nis/nss_nisplus/nisplus-network.c +++ b/nis/nss_nisplus/nisplus-network.c @@ -66,7 +66,7 @@ _nss_nisplus_parse_netent (nis_result *result, struct netent *network, /* The line is too long for our buffer. */ no_more_room: __set_errno (ERANGE); - return 0; + return -1; } strncpy (first_unused, NISENTRYVAL(0, 0, result), @@ -85,10 +85,8 @@ _nss_nisplus_parse_netent (nis_result *result, struct netent *network, if (strcmp (NISENTRYVAL (i, 1, result), network->n_name) != 0) { if (NISENTRYLEN (i, 1, result) + 2 > room_left) - { - __set_errno (ERANGE); - return 0; - } + goto no_more_room; + *p++ = ' '; p = stpncpy (p, NISENTRYVAL (i, 1, result), NISENTRYLEN (i, 1, result)); @@ -120,10 +118,7 @@ _nss_nisplus_parse_netent (nis_result *result, struct netent *network, break; if (room_left < sizeof (char *)) - { - __set_errno (ERANGE); - return 0; - } + goto no_more_room; room_left -= sizeof (char *); network->n_aliases[i] = line; @@ -208,8 +203,12 @@ internal_nisplus_getnetent_r (struct netent *network, char *buffer, /* Get the next entry until we found a correct one. */ do { + nis_result *saved_res; + if (result == NULL) { + saved_res = NULL; + if (tablename_val == NULL) if (_nss_create_tablename() != NSS_STATUS_SUCCESS) return NSS_STATUS_UNAVAIL; @@ -218,8 +217,10 @@ internal_nisplus_getnetent_r (struct netent *network, char *buffer, if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) { int retval; - + retval = niserr2nss (result->status); + nis_freeresult (result); + result = NULL; if (retval == NSS_STATUS_TRYAGAIN) { *herrnop = NETDB_INTERNAL; @@ -235,13 +236,15 @@ internal_nisplus_getnetent_r (struct netent *network, char *buffer, nis_result *res; res = nis_next_entry(tablename_val, &result->cookie); - nis_freeresult (result); + saved_res = result; result = res; if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) { int retval; retval = niserr2nss (result->status); + nis_freeresult (result); + result = saved_res; if (retval == NSS_STATUS_TRYAGAIN) { *herrnop = NETDB_INTERNAL; @@ -251,15 +254,15 @@ internal_nisplus_getnetent_r (struct netent *network, char *buffer, } } - parse_res = _nss_nisplus_parse_netent (result, network, buffer, buflen); - if (!parse_res && errno == ERANGE) + if ((parse_res = _nss_nisplus_parse_netent (result, network, buffer, + buflen)) == -1) { *herrnop = NETDB_INTERNAL; return NSS_STATUS_TRYAGAIN; } - + } while (!parse_res); - + return NSS_STATUS_SUCCESS; } @@ -298,7 +301,7 @@ _nss_nisplus_getnetbyname_r (const char *name, struct netent *network, { nis_result *result; char buf[strlen (name) + 255 + tablename_len]; - + /* Search at first in the alias list, and use the correct name for the next search */ sprintf(buf, "[name=%s],%s", name, tablename_val); @@ -336,11 +339,11 @@ _nss_nisplus_getnetbyname_r (const char *name, struct netent *network, nis_freeresult (result); - if (parse_res) + if (parse_res > 0) return NSS_STATUS_SUCCESS; *herrnop = NETDB_INTERNAL; - if (!parse_res && errno == ERANGE) + if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; @@ -385,11 +388,11 @@ _nss_nisplus_getnetbyaddr_r (const unsigned long addr, const int type, nis_freeresult (result); - if (parse_res) + if (parse_res > 0) return NSS_STATUS_SUCCESS; - + *herrnop = NETDB_INTERNAL; - if (!parse_res && errno == ERANGE) + if (parse_res == -1) return NSS_STATUS_TRYAGAIN; else return NSS_STATUS_NOTFOUND; diff --git a/nis/nss_nisplus/nisplus-parser.c b/nis/nss_nisplus/nisplus-parser.c index bb6bba1e3e..3d0ff32e57 100644 --- a/nis/nss_nisplus/nisplus-parser.c +++ b/nis/nss_nisplus/nisplus-parser.c @@ -55,7 +55,7 @@ _nss_nisplus_parse_pwent (nis_result *result, struct passwd *pw, /* The line is too long for our buffer. */ no_more_room: __set_errno (ERANGE); - return 0; + return -1; } strncpy (first_unused, NISENTRYVAL(0, 0, result), @@ -152,7 +152,7 @@ _nss_nisplus_parse_grent (nis_result *result, u_long entry, /* The line is too long for our buffer. */ no_more_room: __set_errno (ERANGE); - return 0; + return -1; } strncpy (first_unused, NISENTRYVAL (entry, 0, result), @@ -258,7 +258,7 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp, /* The line is too long for our buffer. */ no_more_room: __set_errno (ERANGE); - return 0; + return -1; } strncpy (first_unused, NISENTRYVAL (0, 0, result), diff --git a/nis/nss_nisplus/nisplus-proto.c b/nis/nss_nisplus/nisplus-proto.c index d98317a8a1..707a0e5296 100644 --- a/nis/nss_nisplus/nisplus-proto.c +++ b/nis/nss_nisplus/nisplus-proto.c @@ -63,7 +63,7 @@ _nss_nisplus_parse_protoent (nis_result * result, struct protoent *proto, { no_more_room: __set_errno (ERANGE); - return 0; + return -1; } strncpy (first_unused, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result)); @@ -196,8 +196,11 @@ internal_nisplus_getprotoent_r (struct protoent *proto, char *buffer, /* Get the next entry until we found a correct one. */ do { + nis_result *saved_res; + if (result == NULL) { + saved_res = NULL; if (tablename_val == NULL) if (_nss_create_tablename () != NSS_STATUS_SUCCESS) return NSS_STATUS_UNAVAIL; @@ -209,16 +212,30 @@ internal_nisplus_getprotoent_r (struct protoent *proto, char *buffer, else { nis_result *res; - + + saved_res = result; res = nis_next_entry (tablename_val, &result->cookie); - nis_freeresult (result); result = res; if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) - return niserr2nss (result->status); + { + nis_freeresult (saved_res); + return niserr2nss (result->status); + } } - parse_res = _nss_nisplus_parse_protoent (result, proto, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_protoent (result, proto, buffer, + buflen)) == -1) + { + nis_freeresult (result); + result = saved_res; + return NSS_STATUS_TRYAGAIN; + } + else + { + if (saved_res) + nis_freeresult (saved_res); + } } while (!parse_res); @@ -290,13 +307,12 @@ _nss_nisplus_getprotobyname_r (const char *name, struct protoent *proto, nis_freeresult (result); + if (parse_res == -1) + return NSS_STATUS_TRYAGAIN; if (parse_res) return NSS_STATUS_SUCCESS; - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + return NSS_STATUS_NOTFOUND; } } @@ -327,12 +343,13 @@ _nss_nisplus_getprotobynumber_r (const int number, struct protoent *proto, parse_res = _nss_nisplus_parse_protoent (result, proto, buffer, buflen); nis_freeresult (result); - if (parse_res) - return NSS_STATUS_SUCCESS; - if (!parse_res && errno == ERANGE) + if (parse_res == -1) return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + + if (parse_res) + return NSS_STATUS_SUCCESS; + + return NSS_STATUS_NOTFOUND; } } diff --git a/nis/nss_nisplus/nisplus-pwd.c b/nis/nss_nisplus/nisplus-pwd.c index 459a1a4380..2c1fb19cab 100644 --- a/nis/nss_nisplus/nisplus-pwd.c +++ b/nis/nss_nisplus/nisplus-pwd.c @@ -96,8 +96,11 @@ internal_nisplus_getpwent_r (struct passwd *pw, char *buffer, size_t buflen) /* Get the next entry until we found a correct one. */ do { + nis_result *saved_res; + if (result == NULL) { + saved_res = NULL; if (tablename_val == NULL) if (_nss_create_tablename () != NSS_STATUS_SUCCESS) return NSS_STATUS_UNAVAIL; @@ -110,14 +113,28 @@ internal_nisplus_getpwent_r (struct passwd *pw, char *buffer, size_t buflen) { nis_result *res; + saved_res = result; res = nis_next_entry(tablename_val, &result->cookie); - nis_freeresult (result); result = res; if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) - return niserr2nss (result->status); + { + nis_freeresult (saved_res); + return niserr2nss (result->status); + } } - parse_res = _nss_nisplus_parse_pwent (result, pw, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_pwent (result, pw, buffer, + buflen)) == -1) + { + nis_freeresult (result); + result = saved_res; + return NSS_STATUS_TRYAGAIN; + } + else + { + if (saved_res) + nis_freeresult (saved_res); + } } while (!parse_res); return NSS_STATUS_SUCCESS; @@ -170,13 +187,13 @@ _nss_nisplus_getpwnam_r (const char *name, struct passwd *pw, nis_freeresult (result); + if (parse_res == -1) + return NSS_STATUS_TRYAGAIN; + if (parse_res) return NSS_STATUS_SUCCESS; - - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + + return NSS_STATUS_NOTFOUND; } } @@ -207,12 +224,13 @@ _nss_nisplus_getpwuid_r (const uid_t uid, struct passwd *pw, parse_res = _nss_nisplus_parse_pwent (result, pw, buffer, buflen); nis_freeresult (result); + + if (parse_res == -1) + return NSS_STATUS_TRYAGAIN; + if (parse_res) return NSS_STATUS_SUCCESS; - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + return NSS_STATUS_NOTFOUND; } } diff --git a/nis/nss_nisplus/nisplus-rpc.c b/nis/nss_nisplus/nisplus-rpc.c index 47610a4dca..b70c2ebbca 100644 --- a/nis/nss_nisplus/nisplus-rpc.c +++ b/nis/nss_nisplus/nisplus-rpc.c @@ -64,7 +64,7 @@ _nss_nisplus_parse_rpcent (nis_result *result, struct rpcent *rpc, { no_more_room: __set_errno (ERANGE); - return 0; + return -1; } strncpy (first_unused, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result)); @@ -198,8 +198,11 @@ internal_nisplus_getrpcent_r (struct rpcent *rpc, char *buffer, /* Get the next entry until we found a correct one. */ do { + nis_result *saved_res; + if (result == NULL) { + saved_res = NULL; if (tablename_val == NULL) if (_nss_create_tablename () != NSS_STATUS_SUCCESS) return NSS_STATUS_UNAVAIL; @@ -212,14 +215,28 @@ internal_nisplus_getrpcent_r (struct rpcent *rpc, char *buffer, { nis_result *res; + saved_res = result; res = nis_next_entry (tablename_val, &result->cookie); - nis_freeresult (result); result = res; if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) - return niserr2nss (result->status); + { + nis_freeresult (saved_res); + return niserr2nss (result->status); + } } - parse_res = _nss_nisplus_parse_rpcent (result, rpc, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_rpcent (result, rpc, buffer, + buflen)) == -1) + { + nis_freeresult (result); + result = saved_res; + return NSS_STATUS_TRYAGAIN; + } + else + { + if (saved_res) + nis_freeresult (saved_res); + } } while (!parse_res); return NSS_STATUS_SUCCESS; @@ -290,13 +307,13 @@ _nss_nisplus_getrpcbyname_r (const char *name, struct rpcent *rpc, nis_freeresult (result); + if (parse_res == -1) + return NSS_STATUS_TRYAGAIN; + if (parse_res) return NSS_STATUS_SUCCESS; - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + return NSS_STATUS_NOTFOUND; } } @@ -329,12 +346,12 @@ _nss_nisplus_getrpcbynumber_r (const int number, struct rpcent *rpc, nis_freeresult (result); + if (parse_res == -1) + return NSS_STATUS_TRYAGAIN; + if (parse_res) return NSS_STATUS_SUCCESS; - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + return NSS_STATUS_NOTFOUND; } } diff --git a/nis/nss_nisplus/nisplus-service.c b/nis/nss_nisplus/nisplus-service.c index b97034e9b8..37042d9d13 100644 --- a/nis/nss_nisplus/nisplus-service.c +++ b/nis/nss_nisplus/nisplus-service.c @@ -63,7 +63,7 @@ _nss_nisplus_parse_servent (nis_result *result, struct servent *serv, { no_more_room: __set_errno (ERANGE); - return 0; + return -1; } strncpy (first_unused, NISENTRYVAL (0, 0, result), NISENTRYLEN (0, 0, result)); @@ -204,8 +204,11 @@ internal_nisplus_getservent_r (struct servent *serv, char *buffer, /* Get the next entry until we found a correct one. */ do { + nis_result *saved_res; + if (result == NULL) { + saved_res = NULL; if (tablename_val == NULL) if (_nss_create_tablename () != NSS_STATUS_SUCCESS) return NSS_STATUS_UNAVAIL; @@ -218,14 +221,28 @@ internal_nisplus_getservent_r (struct servent *serv, char *buffer, { nis_result *res; + saved_res = result; res = nis_next_entry (tablename_val, &result->cookie); - nis_freeresult (result); result = res; if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) - return niserr2nss (result->status); + { + nis_freeresult (saved_res); + return niserr2nss (result->status); + } } - parse_res = _nss_nisplus_parse_servent (result, serv, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_servent (result, serv, buffer, + buflen)) == -1) + { + nis_freeresult (result); + result = saved_res; + return NSS_STATUS_TRYAGAIN; + } + else + { + if (saved_res) + nis_freeresult (saved_res); + } } while (!parse_res); @@ -300,16 +317,15 @@ _nss_nisplus_getservbyname_r (const char *name, const char *protocol, } parse_res = _nss_nisplus_parse_servent (result, serv, buffer, buflen); - nis_freeresult (result); + if (parse_res == -1) + return NSS_STATUS_TRYAGAIN; + if (parse_res) return NSS_STATUS_SUCCESS; - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + return NSS_STATUS_NOTFOUND; } } @@ -347,15 +363,14 @@ _nss_nisplus_getservbynumber_r (const int number, const char *protocol, } parse_res = _nss_nisplus_parse_servent (result, serv, buffer, buflen); - nis_freeresult (result); + if (parse_res == -1) + return NSS_STATUS_TRYAGAIN; + if (parse_res) return NSS_STATUS_SUCCESS; - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + return NSS_STATUS_NOTFOUND; } } diff --git a/nis/nss_nisplus/nisplus-spwd.c b/nis/nss_nisplus/nisplus-spwd.c index 81bde4e689..c7f1e2a567 100644 --- a/nis/nss_nisplus/nisplus-spwd.c +++ b/nis/nss_nisplus/nisplus-spwd.c @@ -93,8 +93,12 @@ internal_nisplus_getspent_r (struct spwd *sp, char *buffer, size_t buflen) /* Get the next entry until we found a correct one. */ do { + nis_result *saved_res; + if (result == NULL) { + saved_res = NULL; + if (tablename_val == NULL) if (_nss_create_tablename () != NSS_STATUS_SUCCESS) return NSS_STATUS_UNAVAIL; @@ -107,14 +111,28 @@ internal_nisplus_getspent_r (struct spwd *sp, char *buffer, size_t buflen) { nis_result *res; + saved_res = result; res = nis_next_entry (tablename_val, &result->cookie); - nis_freeresult (result); result = res; if (niserr2nss (result->status) != NSS_STATUS_SUCCESS) - return niserr2nss (result->status); + { + nis_freeresult (saved_res); + return niserr2nss (result->status); + } } - parse_res = _nss_nisplus_parse_spent (result, sp, buffer, buflen); + if ((parse_res = _nss_nisplus_parse_spent (result, sp, buffer, + buflen)) == -1) + { + nis_freeresult (result); + result = saved_res; + return NSS_STATUS_TRYAGAIN; + } + else + { + if (saved_res) + nis_freeresult (saved_res); + } } while (!parse_res); return NSS_STATUS_SUCCESS; @@ -164,15 +182,14 @@ _nss_nisplus_getspnam_r (const char *name, struct spwd *sp, } parse_res = _nss_nisplus_parse_spent (result, sp, buffer, buflen); - nis_freeresult (result); + if (parse_res == -1) + return NSS_STATUS_TRYAGAIN; + if (parse_res) return NSS_STATUS_SUCCESS; - if (!parse_res && errno == ERANGE) - return NSS_STATUS_TRYAGAIN; - else - return NSS_STATUS_NOTFOUND; + return NSS_STATUS_NOTFOUND; } } |