diff options
author | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2019-06-27 09:08:06 +0200 |
---|---|---|
committer | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2019-06-27 09:08:06 +0200 |
commit | 92a2b1758aa56383360603567c17646a1a7fb443 (patch) | |
tree | 7652e270ce7f894fe1d76f5dfce62cc6dab1b277 /src/gns/nss | |
parent | e0698f82e63b071772217f36aeeb53703f86a19d (diff) | |
download | gnunet-92a2b1758aa56383360603567c17646a1a7fb443.tar.gz gnunet-92a2b1758aa56383360603567c17646a1a7fb443.zip |
fix #5782
Diffstat (limited to 'src/gns/nss')
-rw-r--r-- | src/gns/nss/nss_gns_query.c | 99 |
1 files changed, 43 insertions, 56 deletions
diff --git a/src/gns/nss/nss_gns_query.c b/src/gns/nss/nss_gns_query.c index 380788d35..253bb0f02 100644 --- a/src/gns/nss/nss_gns_query.c +++ b/src/gns/nss/nss_gns_query.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <unistd.h> | 30 | #include <unistd.h> |
31 | #include <signal.h> | 31 | #include <signal.h> |
32 | 32 | ||
33 | #define TIMEOUT "5s" | ||
33 | 34 | ||
34 | static void | 35 | static void |
35 | kwait (pid_t chld) | 36 | kwait (pid_t chld) |
@@ -37,9 +38,7 @@ kwait (pid_t chld) | |||
37 | int ret; | 38 | int ret; |
38 | 39 | ||
39 | kill (chld, SIGKILL); | 40 | kill (chld, SIGKILL); |
40 | waitpid (chld, | 41 | waitpid (chld, &ret, 0); |
41 | &ret, | ||
42 | 0); | ||
43 | } | 42 | } |
44 | 43 | ||
45 | 44 | ||
@@ -56,9 +55,7 @@ kwait (pid_t chld) | |||
56 | * else 0 | 55 | * else 0 |
57 | */ | 56 | */ |
58 | int | 57 | int |
59 | gns_resolve_name (int af, | 58 | gns_resolve_name (int af, const char *name, struct userdata *u) |
60 | const char *name, | ||
61 | struct userdata *u) | ||
62 | { | 59 | { |
63 | FILE *p; | 60 | FILE *p; |
64 | char line[128]; | 61 | char line[128]; |
@@ -73,88 +70,78 @@ gns_resolve_name (int af, | |||
73 | return -1; | 70 | return -1; |
74 | if (0 == pid) | 71 | if (0 == pid) |
75 | { | 72 | { |
76 | char *argv[] = { | 73 | char *argv[] = {"gnunet-gns", |
77 | "gnunet-gns", | 74 | "-r", |
78 | "-r", | 75 | "-t", |
79 | "-t", | 76 | (AF_INET6 == af) ? "AAAA" : "A", |
80 | (AF_INET6 == af) ? "AAAA" : "A", | 77 | "-u", |
81 | "-u", | 78 | (char *) name, |
82 | (char *) name, | 79 | "-T", |
83 | NULL | 80 | TIMEOUT, |
84 | }; | 81 | NULL}; |
85 | 82 | ||
86 | (void) close (STDOUT_FILENO); | 83 | (void) close (STDOUT_FILENO); |
87 | if ( (0 != close (out[0])) || | 84 | if ((0 != close (out[0])) || |
88 | (STDOUT_FILENO != dup2 (out[1], STDOUT_FILENO)) ) | 85 | (STDOUT_FILENO != dup2 (out[1], STDOUT_FILENO))) |
89 | _exit (1); | 86 | _exit (1); |
90 | (void) execvp ("gnunet-gns", | 87 | (void) execvp ("gnunet-gns", argv); |
91 | argv); | ||
92 | _exit (1); | 88 | _exit (1); |
93 | } | 89 | } |
94 | (void) close (out[1]); | 90 | (void) close (out[1]); |
95 | p = fdopen (out[0], "r"); | 91 | p = fdopen (out[0], "r"); |
96 | if (NULL == p) | 92 | if (NULL == p) |
97 | { | 93 | { |
98 | kwait (pid); | 94 | kwait (pid); |
99 | return -1; | 95 | return -1; |
100 | } | 96 | } |
101 | while (NULL != fgets (line, | 97 | while (NULL != fgets (line, sizeof (line), p)) |
102 | sizeof (line), | ||
103 | p)) | ||
104 | { | 98 | { |
105 | if (u->count >= MAX_ENTRIES) | 99 | if (u->count >= MAX_ENTRIES) |
106 | break; | 100 | break; |
107 | if (line[strlen(line)-1] == '\n') | 101 | if (line[strlen (line) - 1] == '\n') |
108 | { | 102 | { |
109 | line[strlen(line)-1] = '\0'; | 103 | line[strlen (line) - 1] = '\0'; |
110 | if (AF_INET == af) | 104 | if (AF_INET == af) |
111 | { | 105 | { |
112 | if (inet_pton(af, | 106 | if (inet_pton (af, line, &u->data.ipv4[u->count])) |
113 | line, | 107 | { |
114 | &u->data.ipv4[u->count])) | 108 | u->count++; |
109 | u->data_len += sizeof (ipv4_address_t); | ||
110 | } | ||
111 | else | ||
115 | { | 112 | { |
116 | u->count++; | 113 | (void) fclose (p); |
117 | u->data_len += sizeof(ipv4_address_t); | ||
118 | } | ||
119 | else | ||
120 | { | ||
121 | (void) fclose (p); | ||
122 | kwait (pid); | 114 | kwait (pid); |
123 | errno = EINVAL; | 115 | errno = EINVAL; |
124 | return -1; | 116 | return -1; |
125 | } | 117 | } |
126 | } | 118 | } |
127 | else if (AF_INET6 == af) | 119 | else if (AF_INET6 == af) |
128 | { | 120 | { |
129 | if (inet_pton(af, | 121 | if (inet_pton (af, line, &u->data.ipv6[u->count])) |
130 | line, | ||
131 | &u->data.ipv6[u->count])) | ||
132 | { | 122 | { |
133 | u->count++; | 123 | u->count++; |
134 | u->data_len += sizeof(ipv6_address_t); | 124 | u->data_len += sizeof (ipv6_address_t); |
135 | } | 125 | } |
136 | else | 126 | else |
137 | { | 127 | { |
138 | (void) fclose (p); | 128 | (void) fclose (p); |
139 | kwait (pid); | 129 | kwait (pid); |
140 | errno = EINVAL; | 130 | errno = EINVAL; |
141 | return -1; | 131 | return -1; |
142 | } | 132 | } |
143 | } | 133 | } |
144 | } | 134 | } |
145 | } | 135 | } |
146 | (void) fclose (p); | 136 | (void) fclose (p); |
147 | waitpid (pid, | 137 | waitpid (pid, &ret, 0); |
148 | &ret, | ||
149 | 0); | ||
150 | if (! WIFEXITED (ret)) | 138 | if (! WIFEXITED (ret)) |
151 | return -1; | 139 | return -1; |
152 | if (4 == WEXITSTATUS (ret)) | 140 | if (4 == WEXITSTATUS (ret)) |
153 | return -2; /* not for GNS */ | 141 | return -2; /* not for GNS */ |
154 | if (3 == ret) | 142 | if (3 == ret) |
155 | return -3; /* timeout -> not found */ | 143 | return -3; /* timeout -> not found */ |
156 | if ( (2 == WEXITSTATUS (ret)) || | 144 | if ((2 == WEXITSTATUS (ret)) || (1 == WEXITSTATUS (ret))) |
157 | (1 == WEXITSTATUS (ret)) ) | ||
158 | return -2; /* launch failure -> service unavailable */ | 145 | return -2; /* launch failure -> service unavailable */ |
159 | return 0; | 146 | return 0; |
160 | } | 147 | } |