diff options
author | Christian Grothoff <christian@grothoff.org> | 2018-09-05 15:02:06 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2018-09-05 15:02:06 +0200 |
commit | 727f0d8a8735dd638ff2f714f19c8c23852b99ba (patch) | |
tree | fd43a2d31c0cbebd121c9326c59570b8c2bcf6c9 | |
parent | e111bca33366139f76d6757f55faeb09406febe8 (diff) | |
download | gnunet-727f0d8a8735dd638ff2f714f19c8c23852b99ba.tar.gz gnunet-727f0d8a8735dd638ff2f714f19c8c23852b99ba.zip |
fix gns plugin action on NOTFOUND
-rw-r--r-- | src/gns/nss/nss_gns.c | 31 | ||||
-rw-r--r-- | src/gns/nss/nss_gns_query.c | 22 | ||||
-rw-r--r-- | 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 @@ | |||
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 | } |
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 @@ | |||
23 | #include <sys/types.h> | 23 | #include <sys/types.h> |
24 | #include <sys/socket.h> | 24 | #include <sys/socket.h> |
25 | #include <netinet/in.h> | 25 | #include <netinet/in.h> |
26 | #include <errno.h> | ||
26 | 27 | ||
27 | 28 | ||
28 | /** | 29 | /** |
@@ -32,7 +33,10 @@ | |||
32 | * @param af address family | 33 | * @param af address family |
33 | * @param name the name to resolve | 34 | * @param name the name to resolve |
34 | * @param u the userdata (result struct) | 35 | * @param u the userdata (result struct) |
35 | * @return -1 on error else 0 | 36 | * @return -1 on internal error, |
37 | * -2 if request is not for GNS, | ||
38 | * -3 on timeout, | ||
39 | * else 0 | ||
36 | */ | 40 | */ |
37 | int | 41 | int |
38 | gns_resolve_name (int af, | 42 | gns_resolve_name (int af, |
@@ -43,6 +47,7 @@ gns_resolve_name (int af, | |||
43 | char *cmd; | 47 | char *cmd; |
44 | char line[128]; | 48 | char line[128]; |
45 | int ret; | 49 | int ret; |
50 | int es; | ||
46 | 51 | ||
47 | if (AF_INET6 == af) | 52 | if (AF_INET6 == af) |
48 | { | 53 | { |
@@ -62,7 +67,9 @@ gns_resolve_name (int af, | |||
62 | } | 67 | } |
63 | if (NULL == (p = popen (cmd, "r"))) | 68 | if (NULL == (p = popen (cmd, "r"))) |
64 | { | 69 | { |
70 | es = errno; | ||
65 | free (cmd); | 71 | free (cmd); |
72 | errno = es; | ||
66 | return -1; | 73 | return -1; |
67 | } | 74 | } |
68 | while (NULL != fgets (line, | 75 | while (NULL != fgets (line, |
@@ -85,8 +92,9 @@ gns_resolve_name (int af, | |||
85 | } | 92 | } |
86 | else | 93 | else |
87 | { | 94 | { |
88 | pclose (p); | 95 | (void) pclose (p); |
89 | free (cmd); | 96 | free (cmd); |
97 | errno = EINVAL; | ||
90 | return -1; | 98 | return -1; |
91 | } | 99 | } |
92 | } | 100 | } |
@@ -101,8 +109,9 @@ gns_resolve_name (int af, | |||
101 | } | 109 | } |
102 | else | 110 | else |
103 | { | 111 | { |
104 | pclose (p); | 112 | (void) pclose (p); |
105 | free (cmd); | 113 | free (cmd); |
114 | errno = EINVAL; | ||
106 | return -1; | 115 | return -1; |
107 | } | 116 | } |
108 | } | 117 | } |
@@ -110,11 +119,14 @@ gns_resolve_name (int af, | |||
110 | } | 119 | } |
111 | ret = pclose (p); | 120 | ret = pclose (p); |
112 | free (cmd); | 121 | free (cmd); |
113 | if (4 == ret) | 122 | if (! WIFEXITED (ret)) |
123 | return -1; | ||
124 | if (4 == WEXITSTATUS (ret)) | ||
114 | return -2; /* not for GNS */ | 125 | return -2; /* not for GNS */ |
115 | if (3 == ret) | 126 | if (3 == ret) |
116 | return -3; /* timeout -> not found */ | 127 | return -3; /* timeout -> not found */ |
117 | if ( (2 == ret) || (1 == ret) ) | 128 | if ( (2 == WEXITSTATUS (ret)) || |
129 | (1 == WEXITSTATUS (ret)) ) | ||
118 | return -2; /* launch failure -> service unavailable */ | 130 | return -2; /* launch failure -> service unavailable */ |
119 | return 0; | 131 | return 0; |
120 | } | 132 | } |
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 | |||
57 | * @param af address family | 57 | * @param af address family |
58 | * @param name the name to resolve | 58 | * @param name the name to resolve |
59 | * @param u the userdata (result struct) | 59 | * @param u the userdata (result struct) |
60 | * @return -1 on error else 0 | 60 | * @return -1 on internal error, |
61 | * -2 if request is not for GNS, | ||
62 | * -3 on timeout, | ||
63 | * else 0 | ||
61 | */ | 64 | */ |
62 | int | 65 | int |
63 | gns_resolve_name(int af, | 66 | gns_resolve_name(int af, |