From 727f0d8a8735dd638ff2f714f19c8c23852b99ba Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 5 Sep 2018 15:02:06 +0200 Subject: fix gns plugin action on NOTFOUND --- src/gns/nss/nss_gns.c | 31 ++++++++++++++++++++++++------- src/gns/nss/nss_gns_query.c | 22 +++++++++++++++++----- src/gns/nss/nss_gns_query.h | 5 ++++- 3 files changed, 45 insertions(+), 13 deletions(-) diff --git a/src/gns/nss/nss_gns.c b/src/gns/nss/nss_gns.c index 58aab47fd..d76eac845 100644 --- a/src/gns/nss/nss_gns.c +++ b/src/gns/nss/nss_gns.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "nss_gns_query.h" @@ -94,8 +95,8 @@ _nss_gns_gethostbyname2_r(const char *name, address_length = (af == AF_INET) ? sizeof(ipv4_address_t) : sizeof(ipv6_address_t); if (buflen < - sizeof(char*)+ /* alias names */ - strlen(name)+1) + sizeof(char*) + /* alias names */ + strlen (name) + 1) { /* official name */ *errnop = ERANGE; *h_errnop = NO_RECOVERY; @@ -108,24 +109,34 @@ _nss_gns_gethostbyname2_r(const char *name, i = gns_resolve_name (af, name, &u); - if (-3 == i) + if (-1 == i) { - status = NSS_STATUS_NOTFOUND; + *errnop = errno; + status = NSS_STATUS_UNAVAIL; + *h_errnop = NO_RECOVERY; goto finish; } if (-2 == i) { + *errnop = ENOENT; + *h_errnop = NO_RECOVERY; status = NSS_STATUS_UNAVAIL; goto finish; } - if ( (-1 == i) || - (u.count == 0) ) + if (-3 == i) { *errnop = ETIMEDOUT; *h_errnop = HOST_NOT_FOUND; status = NSS_STATUS_NOTFOUND; goto finish; } + if (0 == u.count) + { + *errnop = 0; /* success */ + *h_errnop = NO_DATA; /* success */ + status = NSS_STATUS_NOTFOUND; + goto finish; + } /* Alias names */ *((char**) buffer) = NULL; result->h_aliases = (char**) buffer; @@ -227,8 +238,14 @@ _nss_gns_gethostbyaddr_r (const void* addr, int *errnop, int *h_errnop) { + (void) addr; + (void) len; + (void) af; + (void) result; + (void) buffer; + (void) buflen; *errnop = EINVAL; *h_errnop = NO_RECOVERY; - //NOTE we allow to leak this into DNS so no NOTFOUND + /* NOTE we allow to leak this into DNS so no NOTFOUND */ return NSS_STATUS_UNAVAIL; } diff --git a/src/gns/nss/nss_gns_query.c b/src/gns/nss/nss_gns_query.c index 867ead624..032b2c93b 100644 --- a/src/gns/nss/nss_gns_query.c +++ b/src/gns/nss/nss_gns_query.c @@ -23,6 +23,7 @@ #include #include #include +#include /** @@ -32,7 +33,10 @@ * @param af address family * @param name the name to resolve * @param u the userdata (result struct) - * @return -1 on error else 0 + * @return -1 on internal error, + * -2 if request is not for GNS, + * -3 on timeout, + * else 0 */ int gns_resolve_name (int af, @@ -43,6 +47,7 @@ gns_resolve_name (int af, char *cmd; char line[128]; int ret; + int es; if (AF_INET6 == af) { @@ -62,7 +67,9 @@ gns_resolve_name (int af, } if (NULL == (p = popen (cmd, "r"))) { + es = errno; free (cmd); + errno = es; return -1; } while (NULL != fgets (line, @@ -85,8 +92,9 @@ gns_resolve_name (int af, } else { - pclose (p); + (void) pclose (p); free (cmd); + errno = EINVAL; return -1; } } @@ -101,8 +109,9 @@ gns_resolve_name (int af, } else { - pclose (p); + (void) pclose (p); free (cmd); + errno = EINVAL; return -1; } } @@ -110,11 +119,14 @@ gns_resolve_name (int af, } ret = pclose (p); free (cmd); - if (4 == ret) + if (! WIFEXITED (ret)) + return -1; + if (4 == WEXITSTATUS (ret)) return -2; /* not for GNS */ if (3 == ret) return -3; /* timeout -> not found */ - if ( (2 == ret) || (1 == ret) ) + if ( (2 == WEXITSTATUS (ret)) || + (1 == WEXITSTATUS (ret)) ) return -2; /* launch failure -> service unavailable */ return 0; } diff --git a/src/gns/nss/nss_gns_query.h b/src/gns/nss/nss_gns_query.h index 48cab4b22..bc732b3aa 100644 --- a/src/gns/nss/nss_gns_query.h +++ b/src/gns/nss/nss_gns_query.h @@ -57,7 +57,10 @@ struct userdata * @param af address family * @param name the name to resolve * @param u the userdata (result struct) - * @return -1 on error else 0 + * @return -1 on internal error, + * -2 if request is not for GNS, + * -3 on timeout, + * else 0 */ int gns_resolve_name(int af, -- cgit v1.2.3