diff options
Diffstat (limited to 'src/gns/nss/nss_gns.c')
-rw-r--r-- | src/gns/nss/nss_gns.c | 31 |
1 files changed, 24 insertions, 7 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 @@ | |||
29 | #include <nss.h> | 29 | #include <nss.h> |
30 | #include <stdio.h> | 30 | #include <stdio.h> |
31 | #include <stdlib.h> | 31 | #include <stdlib.h> |
32 | #include <errno.h> | ||
32 | 33 | ||
33 | #include "nss_gns_query.h" | 34 | #include "nss_gns_query.h" |
34 | 35 | ||
@@ -94,8 +95,8 @@ _nss_gns_gethostbyname2_r(const char *name, | |||
94 | 95 | ||
95 | address_length = (af == AF_INET) ? sizeof(ipv4_address_t) : sizeof(ipv6_address_t); | 96 | address_length = (af == AF_INET) ? sizeof(ipv4_address_t) : sizeof(ipv6_address_t); |
96 | if (buflen < | 97 | if (buflen < |
97 | sizeof(char*)+ /* alias names */ | 98 | sizeof(char*) + /* alias names */ |
98 | strlen(name)+1) | 99 | strlen (name) + 1) |
99 | { /* official name */ | 100 | { /* official name */ |
100 | *errnop = ERANGE; | 101 | *errnop = ERANGE; |
101 | *h_errnop = NO_RECOVERY; | 102 | *h_errnop = NO_RECOVERY; |
@@ -108,24 +109,34 @@ _nss_gns_gethostbyname2_r(const char *name, | |||
108 | i = gns_resolve_name (af, | 109 | i = gns_resolve_name (af, |
109 | name, | 110 | name, |
110 | &u); | 111 | &u); |
111 | if (-3 == i) | 112 | if (-1 == i) |
112 | { | 113 | { |
113 | status = NSS_STATUS_NOTFOUND; | 114 | *errnop = errno; |
115 | status = NSS_STATUS_UNAVAIL; | ||
116 | *h_errnop = NO_RECOVERY; | ||
114 | goto finish; | 117 | goto finish; |
115 | } | 118 | } |
116 | if (-2 == i) | 119 | if (-2 == i) |
117 | { | 120 | { |
121 | *errnop = ENOENT; | ||
122 | *h_errnop = NO_RECOVERY; | ||
118 | status = NSS_STATUS_UNAVAIL; | 123 | status = NSS_STATUS_UNAVAIL; |
119 | goto finish; | 124 | goto finish; |
120 | } | 125 | } |
121 | if ( (-1 == i) || | 126 | if (-3 == i) |
122 | (u.count == 0) ) | ||
123 | { | 127 | { |
124 | *errnop = ETIMEDOUT; | 128 | *errnop = ETIMEDOUT; |
125 | *h_errnop = HOST_NOT_FOUND; | 129 | *h_errnop = HOST_NOT_FOUND; |
126 | status = NSS_STATUS_NOTFOUND; | 130 | status = NSS_STATUS_NOTFOUND; |
127 | goto finish; | 131 | goto finish; |
128 | } | 132 | } |
133 | if (0 == u.count) | ||
134 | { | ||
135 | *errnop = 0; /* success */ | ||
136 | *h_errnop = NO_DATA; /* success */ | ||
137 | status = NSS_STATUS_NOTFOUND; | ||
138 | goto finish; | ||
139 | } | ||
129 | /* Alias names */ | 140 | /* Alias names */ |
130 | *((char**) buffer) = NULL; | 141 | *((char**) buffer) = NULL; |
131 | result->h_aliases = (char**) buffer; | 142 | result->h_aliases = (char**) buffer; |
@@ -227,8 +238,14 @@ _nss_gns_gethostbyaddr_r (const void* addr, | |||
227 | int *errnop, | 238 | int *errnop, |
228 | int *h_errnop) | 239 | int *h_errnop) |
229 | { | 240 | { |
241 | (void) addr; | ||
242 | (void) len; | ||
243 | (void) af; | ||
244 | (void) result; | ||
245 | (void) buffer; | ||
246 | (void) buflen; | ||
230 | *errnop = EINVAL; | 247 | *errnop = EINVAL; |
231 | *h_errnop = NO_RECOVERY; | 248 | *h_errnop = NO_RECOVERY; |
232 | //NOTE we allow to leak this into DNS so no NOTFOUND | 249 | /* NOTE we allow to leak this into DNS so no NOTFOUND */ |
233 | return NSS_STATUS_UNAVAIL; | 250 | return NSS_STATUS_UNAVAIL; |
234 | } | 251 | } |