aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-09-05 15:02:06 +0200
committerChristian Grothoff <christian@grothoff.org>2018-09-05 15:02:06 +0200
commit727f0d8a8735dd638ff2f714f19c8c23852b99ba (patch)
treefd43a2d31c0cbebd121c9326c59570b8c2bcf6c9
parente111bca33366139f76d6757f55faeb09406febe8 (diff)
downloadgnunet-727f0d8a8735dd638ff2f714f19c8c23852b99ba.tar.gz
gnunet-727f0d8a8735dd638ff2f714f19c8c23852b99ba.zip
fix gns plugin action on NOTFOUND
-rw-r--r--src/gns/nss/nss_gns.c31
-rw-r--r--src/gns/nss/nss_gns_query.c22
-rw-r--r--src/gns/nss/nss_gns_query.h5
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 */
37int 41int
38gns_resolve_name (int af, 42gns_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 */
62int 65int
63gns_resolve_name(int af, 66gns_resolve_name(int af,