diff options
-rw-r--r-- | include/nss.h | 5 | ||||
-rw-r--r-- | lib/libc/net/nss_compat.c | 23 |
2 files changed, 18 insertions, 10 deletions
diff --git a/include/nss.h b/include/nss.h index 86a08ed..1f4d078 100644 --- a/include/nss.h +++ b/include/nss.h @@ -46,8 +46,9 @@ enum nss_status { NSS_STATUS_RETURN }; -#define __nss_compat_result(rv) \ -((rv == NSS_STATUS_TRYAGAIN) ? NS_TRYAGAIN : \ +#define __nss_compat_result(rv, err) \ +((rv == NSS_STATUS_TRYAGAIN && err == ERANGE) ? NS_RETURN : \ + (rv == NSS_STATUS_TRYAGAIN) ? NS_TRYAGAIN : \ (rv == NSS_STATUS_UNAVAIL) ? NS_UNAVAIL : \ (rv == NSS_STATUS_NOTFOUND) ? NS_NOTFOUND : \ (rv == NSS_STATUS_SUCCESS) ? NS_SUCCESS : \ diff --git a/lib/libc/net/nss_compat.c b/lib/libc/net/nss_compat.c index 8441103..a81ec8a 100644 --- a/lib/libc/net/nss_compat.c +++ b/lib/libc/net/nss_compat.c @@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$"); #include "namespace.h" #include <sys/param.h> +#include <errno.h> #include <nss.h> #include <pthread.h> #include <pthread_np.h> @@ -96,9 +97,10 @@ __nss_compat_getgrnam_r(void *retval, void *mdata, va_list ap) bufsize = va_arg(ap, size_t); errnop = va_arg(ap, int *); status = fn(name, grp, buffer, bufsize, errnop); + status = __nss_compat_result(status, *errnop); if (status == NS_SUCCESS) *(struct group **)retval = grp; - return (__nss_compat_result(status)); + return (status); } @@ -120,9 +122,10 @@ __nss_compat_getgrgid_r(void *retval, void *mdata, va_list ap) bufsize = va_arg(ap, size_t); errnop = va_arg(ap, int *); status = fn(gid, grp, buffer, bufsize, errnop); + status = __nss_compat_result(status, *errnop); if (status == NS_SUCCESS) *(struct group **)retval = grp; - return (__nss_compat_result(status)); + return (status); } @@ -144,11 +147,12 @@ __nss_compat_getgrent_r(void *retval, void *mdata, va_list ap) bufsize = va_arg(ap, size_t); errnop = va_arg(ap, int *); status = fn(grp, buffer, bufsize, errnop); + status = __nss_compat_result(status, *errnop); if (status == NS_SUCCESS) *(struct group **)retval = grp; - else + else if (status != NS_RETURN) SET_TERMINATOR(group, &terminator); - return (__nss_compat_result(status)); + return (status); } @@ -194,9 +198,10 @@ __nss_compat_getpwnam_r(void *retval, void *mdata, va_list ap) bufsize = va_arg(ap, size_t); errnop = va_arg(ap, int *); status = fn(name, pwd, buffer, bufsize, errnop); + status = __nss_compat_result(status, *errnop); if (status == NS_SUCCESS) *(struct passwd **)retval = pwd; - return (__nss_compat_result(status)); + return (status); } @@ -218,9 +223,10 @@ __nss_compat_getpwuid_r(void *retval, void *mdata, va_list ap) bufsize = va_arg(ap, size_t); errnop = va_arg(ap, int *); status = fn(uid, pwd, buffer, bufsize, errnop); + status = __nss_compat_result(status, *errnop); if (status == NS_SUCCESS) *(struct passwd **)retval = pwd; - return (__nss_compat_result(status)); + return (status); } @@ -242,11 +248,12 @@ __nss_compat_getpwent_r(void *retval, void *mdata, va_list ap) bufsize = va_arg(ap, size_t); errnop = va_arg(ap, int *); status = fn(pwd, buffer, bufsize, errnop); + status = __nss_compat_result(status, *errnop); if (status == NS_SUCCESS) *(struct passwd **)retval = pwd; - else + else if (status != NS_RETURN) SET_TERMINATOR(passwd, &terminator); - return (__nss_compat_result(status)); + return (status); } |