c849849d06
incorrectly when encountering `large' groups (many members and/or many long member names). The reporter tracked this down to the glibc NSS module compatibility code (nss_compat.c): it would prematurely record that a NSS module was finished iterating through its database in some cases. Two aspects are corrected: 1. nss_compat.c recorded that a NSS module was finished iterating whenever the module reported something other than SUCCESS. The correct logic is to continue iteration when the module reports either SUCCESS or RETURN. The __nss_compat_getgrent_r and __nss_compat_getpwent_r routines are updated to reflect this. 2. An internal helper macro __nss_compat_result is used to map glibc NSS status codes to BSD NSS status codes (e.g. NSS_STATUS_SUCCESS -> NS_SUCCESS). It provided the obvious mapping. When a NSS routine is called with a too-small buffer, the convention in the BSD NSS code is to report RETURN. (This is used to implement reentrant APIs such as getpwnam_r(3).) However, the convention in glibc for this case is to set errno = ERANGE and overload TRYAGAIN. __nss_compat_result is updated to handle this case. PR: bin/60287 Reported by: Lachlan O'Dea <odela01@ca.com> |
||
---|---|---|
.. | ||
addr2ascii.3 | ||
addr2ascii.c | ||
ascii2addr.c | ||
base64.c | ||
byteorder.3 | ||
ether_addr.c | ||
ethers.3 | ||
getaddrinfo.3 | ||
getaddrinfo.c | ||
gethostbydns.c | ||
gethostbyht.c | ||
gethostbyname.3 | ||
gethostbynis.c | ||
gethostnamadr.c | ||
getifaddrs.3 | ||
getifaddrs.c | ||
getifmaddrs.3 | ||
getifmaddrs.c | ||
getipnodebyname.3 | ||
getnameinfo.3 | ||
getnameinfo.c | ||
getnetbydns.c | ||
getnetbyht.c | ||
getnetbynis.c | ||
getnetent.3 | ||
getnetnamadr.c | ||
getproto.c | ||
getprotoent.3 | ||
getprotoent.c | ||
getprotoname.c | ||
getservbyname.c | ||
getservbyport.c | ||
getservent.3 | ||
getservent.c | ||
herror.c | ||
hesiod.3 | ||
hesiod.c | ||
if_indextoname.3 | ||
if_indextoname.c | ||
if_nameindex.c | ||
if_nametoindex.c | ||
inet6_opt_init.3 | ||
inet6_option_space.3 | ||
inet6_rth_space.3 | ||
inet6_rthdr_space.3 | ||
inet_addr.c | ||
inet_lnaof.c | ||
inet_makeaddr.c | ||
inet_net_ntop.c | ||
inet_net_pton.c | ||
inet_net.3 | ||
inet_neta.c | ||
inet_netof.c | ||
inet_network.c | ||
inet_ntoa.c | ||
inet_ntop.c | ||
inet_pton.c | ||
inet.3 | ||
ip6opt.c | ||
linkaddr.3 | ||
linkaddr.c | ||
Makefile.inc | ||
map_v4v6.c | ||
name6.c | ||
ns_name.c | ||
ns_netint.c | ||
ns_parse.c | ||
ns_print.c | ||
ns_ttl.c | ||
nsap_addr.c | ||
nsdispatch.3 | ||
nsdispatch.c | ||
nslexer.l | ||
nsparser.y | ||
nss_backends.h | ||
nss_compat.c | ||
rcmd.3 | ||
rcmd.c | ||
rcmdsh.3 | ||
rcmdsh.c | ||
recv.c | ||
res_comp.c | ||
res_config.h | ||
res_data.c | ||
res_debug.c | ||
res_init.c | ||
res_mkquery.c | ||
res_mkupdate.c | ||
res_query.c | ||
res_send.c | ||
res_update.c | ||
resolver.3 | ||
rthdr.c | ||
send.c | ||
sockatmark.3 | ||
sockatmark.c | ||
vars.c |