]>
Commit | Line | Data |
---|---|---|
7b1c77f9 | 1 | 2002-10-09 Jakub Jelinek <jakub@redhat.com> |
2 | ||
3 | * resolv/nss_dns/dns-host.c (_nss_dns_gethostbyname2_r, | |
4 | _nss_dns_gethostbyaddr_r): Use malloc for host_buffer. | |
5 | * resolv/nss_dns/dns-network.c (_nss_dns_getnetbyname_r, | |
6 | _nss_dns_getnetbyaddr_r): Use malloc for net_buffer. | |
7 | * resolv/res_query.c (res_nquery): Use malloc for buf. | |
8 | * resolv/gethnamaddr.c (gethostbyname2, gethostbyaddr): Likewise. | |
9 | ||
10 | --- libc/resolv/nss_dns/dns-host.c.jj Thu Dec 27 14:34:02 2001 | |
11 | +++ libc/resolv/nss_dns/dns-host.c Wed Oct 9 11:23:19 2002 | |
12 | @@ -132,11 +132,12 @@ _nss_dns_gethostbyname2_r (const char *n | |
13 | char *buffer, size_t buflen, int *errnop, | |
14 | int *h_errnop) | |
15 | { | |
16 | - querybuf host_buffer; | |
17 | + querybuf *host_buffer; | |
18 | char tmp[NS_MAXDNAME]; | |
19 | int size, type, n; | |
20 | const char *cp; | |
21 | int map = 0; | |
22 | + enum nss_status status; | |
23 | ||
24 | if ((_res.options & RES_INIT) == 0 && __res_ninit (&_res) == -1) | |
25 | return NSS_STATUS_UNAVAIL; | |
26 | @@ -168,8 +169,15 @@ _nss_dns_gethostbyname2_r (const char *n | |
27 | && (cp = res_hostalias (&_res, name, tmp, sizeof (tmp))) != NULL) | |
28 | name = cp; | |
29 | ||
30 | - n = res_nsearch (&_res, name, C_IN, type, host_buffer.buf, | |
31 | - sizeof (host_buffer.buf)); | |
32 | + host_buffer = (querybuf *) malloc (sizeof (querybuf)); | |
33 | + if (host_buffer == NULL) | |
34 | + { | |
35 | + *errnop = ENOMEM; | |
36 | + return NSS_STATUS_UNAVAIL; | |
37 | + } | |
38 | + | |
39 | + n = res_nsearch (&_res, name, C_IN, type, host_buffer->buf, | |
40 | + sizeof (host_buffer->buf)); | |
41 | if (n < 0) | |
42 | { | |
43 | enum nss_status status = (errno == ECONNREFUSED | |
44 | @@ -181,11 +189,14 @@ _nss_dns_gethostbyname2_r (const char *n | |
45 | by having the RES_USE_INET6 bit in _res.options set, we try | |
46 | another lookup. */ | |
47 | if (af == AF_INET6 && (_res.options & RES_USE_INET6)) | |
48 | - n = res_nsearch (&_res, name, C_IN, T_A, host_buffer.buf, | |
49 | - sizeof (host_buffer.buf)); | |
50 | + n = res_nsearch (&_res, name, C_IN, T_A, host_buffer->buf, | |
51 | + sizeof (host_buffer->buf)); | |
52 | ||
53 | if (n < 0) | |
54 | - return status; | |
55 | + { | |
56 | + free (host_buffer); | |
57 | + return status; | |
58 | + } | |
59 | ||
60 | map = 1; | |
61 | ||
62 | @@ -193,8 +204,10 @@ _nss_dns_gethostbyname2_r (const char *n | |
63 | result->h_length = INADDRSZ;; | |
64 | } | |
65 | ||
66 | - return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen, | |
67 | - errnop, h_errnop, map); | |
68 | + status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen, | |
69 | + errnop, h_errnop, map); | |
70 | + free (host_buffer); | |
71 | + return status; | |
72 | } | |
73 | ||
74 | ||
75 | @@ -232,7 +245,7 @@ _nss_dns_gethostbyaddr_r (const void *ad | |
76 | char *h_addr_ptrs[MAX_NR_ADDRS + 1]; | |
77 | char linebuffer[0]; | |
78 | } *host_data = (struct host_data *) buffer; | |
79 | - querybuf host_buffer; | |
80 | + querybuf *host_buffer; | |
81 | char qbuf[MAXDNAME+1], *qp; | |
82 | size_t size; | |
83 | int n, status; | |
84 | @@ -289,17 +302,26 @@ _nss_dns_gethostbyaddr_r (const void *ad | |
85 | break; | |
86 | } | |
87 | ||
88 | - n = res_nquery (&_res, qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf, | |
89 | - sizeof host_buffer); | |
90 | + host_buffer = (querybuf *) malloc (sizeof (querybuf)); | |
91 | + if (host_buffer == NULL) | |
92 | + { | |
93 | + *errnop = ENOMEM; | |
94 | + return NSS_STATUS_UNAVAIL; | |
95 | + } | |
96 | + | |
97 | + n = res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer->buf, | |
98 | + sizeof (host_buffer->buf)); | |
99 | if (n < 0) | |
100 | { | |
101 | *h_errnop = h_errno; | |
102 | *errnop = errno; | |
103 | + free (host_buffer); | |
104 | return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; | |
105 | } | |
106 | ||
107 | - status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen, | |
108 | + status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen, | |
109 | errnop, h_errnop, 0 /* XXX */); | |
110 | + free (host_buffer); | |
111 | if (status != NSS_STATUS_SUCCESS) | |
112 | { | |
113 | *h_errnop = h_errno; | |
114 | --- libc/resolv/nss_dns/dns-network.c.jj Mon Jul 9 14:57:48 2001 | |
115 | +++ libc/resolv/nss_dns/dns-network.c Thu Oct 10 07:27:19 2002 | |
116 | @@ -110,27 +110,39 @@ _nss_dns_getnetbyname_r (const char *nam | |
117 | int *herrnop) | |
118 | { | |
119 | /* Return entry for network with NAME. */ | |
120 | - querybuf net_buffer; | |
121 | + querybuf *net_buffer; | |
122 | int anslen; | |
123 | char *qbuf; | |
124 | + enum nss_status status; | |
125 | ||
126 | if ((_res.options & RES_INIT) == 0 && __res_ninit (&_res) == -1) | |
127 | return NSS_STATUS_UNAVAIL; | |
128 | ||
129 | qbuf = strdupa (name); | |
130 | - anslen = res_nsearch (&_res, qbuf, C_IN, T_PTR, (u_char *) &net_buffer, | |
131 | - sizeof (querybuf)); | |
132 | + | |
133 | + net_buffer = (querybuf *) malloc (sizeof (querybuf)); | |
134 | + if (net_buffer == NULL) | |
135 | + { | |
136 | + *errnop = ENOMEM; | |
137 | + return NSS_STATUS_UNAVAIL; | |
138 | + } | |
139 | + | |
140 | + anslen = res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer->buf, | |
141 | + sizeof (net_buffer->buf)); | |
142 | if (anslen < 0) | |
143 | { | |
144 | /* Nothing found. */ | |
145 | *errnop = errno; | |
146 | + free (net_buffer); | |
147 | return (errno == ECONNREFUSED | |
148 | || errno == EPFNOSUPPORT | |
149 | || errno == EAFNOSUPPORT) | |
150 | ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; | |
151 | } | |
152 | ||
153 | - return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME); | |
154 | + status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME); | |
155 | + free (net_buffer); | |
156 | + return status; | |
157 | } | |
158 | ||
159 | ||
160 | @@ -141,7 +153,7 @@ _nss_dns_getnetbyaddr_r (uint32_t net, i | |
161 | { | |
162 | /* Return entry for network with NAME. */ | |
163 | enum nss_status status; | |
164 | - querybuf net_buffer; | |
165 | + querybuf *net_buffer; | |
166 | unsigned int net_bytes[4]; | |
167 | char qbuf[MAXDNAME]; | |
168 | int cnt, anslen; | |
169 | @@ -180,19 +192,28 @@ _nss_dns_getnetbyaddr_r (uint32_t net, i | |
170 | break; | |
171 | } | |
172 | ||
173 | - anslen = res_nquery (&_res, qbuf, C_IN, T_PTR, (u_char *) &net_buffer, | |
174 | - sizeof (querybuf)); | |
175 | + net_buffer = (querybuf *) malloc (sizeof (querybuf)); | |
176 | + if (net_buffer == NULL) | |
177 | + { | |
178 | + *errnop = ENOMEM; | |
179 | + return NSS_STATUS_UNAVAIL; | |
180 | + } | |
181 | + | |
182 | + anslen = res_nquery (&_res, qbuf, C_IN, T_PTR, net_buffer->buf, | |
183 | + sizeof (net_buffer->buf)); | |
184 | if (anslen < 0) | |
185 | { | |
186 | /* Nothing found. */ | |
187 | *errnop = errno; | |
188 | + free (net_buffer); | |
189 | return (errno == ECONNREFUSED | |
190 | || errno == EPFNOSUPPORT | |
191 | || errno == EAFNOSUPPORT) | |
192 | ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; | |
193 | } | |
194 | ||
195 | - status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR); | |
196 | + status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR); | |
197 | + free (net_buffer); | |
198 | if (status == NSS_STATUS_SUCCESS) | |
199 | { | |
200 | /* Strip trailing zeros. */ | |
201 | --- libc/resolv/res_query.c.jj Wed Jan 10 11:04:04 2001 | |
202 | +++ libc/resolv/res_query.c Wed Oct 9 15:10:46 2002 | |
203 | @@ -108,28 +108,36 @@ res_nquery(res_state statp, | |
204 | u_char *answer, /* buffer to put answer */ | |
205 | int anslen) /* size of answer buffer */ | |
206 | { | |
207 | - u_char buf[MAXPACKET]; | |
208 | + u_char *buf; | |
209 | HEADER *hp = (HEADER *) answer; | |
210 | int n; | |
211 | ||
212 | hp->rcode = NOERROR; /* default */ | |
213 | ||
214 | + buf = malloc (MAXPACKET); | |
215 | + if (buf == NULL) { | |
216 | + __set_h_errno (NETDB_INTERNAL); | |
217 | + return -1; | |
218 | + } | |
219 | + | |
220 | #ifdef DEBUG | |
221 | if (statp->options & RES_DEBUG) | |
222 | printf(";; res_query(%s, %d, %d)\n", name, class, type); | |
223 | #endif | |
224 | ||
225 | n = res_nmkquery(statp, QUERY, name, class, type, NULL, 0, NULL, | |
226 | - buf, sizeof(buf)); | |
227 | + buf, MAXPACKET); | |
228 | if (n <= 0) { | |
229 | #ifdef DEBUG | |
230 | if (statp->options & RES_DEBUG) | |
231 | printf(";; res_query: mkquery failed\n"); | |
232 | #endif | |
233 | RES_SET_H_ERRNO(statp, NO_RECOVERY); | |
234 | + free (buf); | |
235 | return (n); | |
236 | } | |
237 | n = res_nsend(statp, buf, n, answer, anslen); | |
238 | + free (buf); | |
239 | if (n < 0) { | |
240 | #ifdef DEBUG | |
241 | if (statp->options & RES_DEBUG) | |
242 | --- libc/resolv/gethnamaddr.c.jj Thu Dec 27 14:34:00 2001 | |
243 | +++ libc/resolv/gethnamaddr.c Thu Oct 10 10:05:44 2002 | |
244 | @@ -510,10 +510,11 @@ gethostbyname2(name, af) | |
245 | const char *name; | |
246 | int af; | |
247 | { | |
248 | - querybuf buf; | |
249 | + querybuf *buf; | |
250 | register const char *cp; | |
251 | char *bp; | |
252 | int n, size, type, len; | |
253 | + struct hostent *ret; | |
254 | extern struct hostent *_gethtbyname2(); | |
255 | ||
256 | if ((_res.options & RES_INIT) == 0 && __res_ninit(&_res) == -1) { | |
257 | @@ -615,13 +616,22 @@ gethostbyname2(name, af) | |
258 | break; | |
259 | } | |
260 | ||
261 | - if ((n = res_nsearch(&_res, name, C_IN, type, buf.buf, sizeof(buf.buf))) < 0) { | |
262 | + buf = (querybuf *) malloc (sizeof (*buf)); | |
263 | + if (buf == NULL) { | |
264 | + __set_h_errno (NETDB_INTERNAL); | |
265 | + return NULL; | |
266 | + } | |
267 | + | |
268 | + if ((n = res_nsearch(&_res, name, C_IN, type, buf->buf, sizeof(buf->buf))) < 0) { | |
269 | + free (buf); | |
270 | dprintf("res_nsearch failed (%d)\n", n); | |
271 | if (errno == ECONNREFUSED) | |
272 | return (_gethtbyname2(name, af)); | |
273 | return (NULL); | |
274 | } | |
275 | - return (getanswer(&buf, n, name, type)); | |
276 | + ret = getanswer(buf, n, name, type); | |
277 | + free (buf); | |
278 | + return ret; | |
279 | } | |
280 | ||
281 | struct hostent * | |
282 | @@ -634,7 +644,7 @@ gethostbyaddr(addr, len, af) | |
283 | static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; | |
284 | static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; | |
285 | int n, size; | |
286 | - querybuf buf; | |
287 | + querybuf *buf; | |
288 | register struct hostent *hp; | |
289 | char qbuf[MAXDNAME+1], *qp; | |
290 | #ifdef SUNSECURITY | |
291 | @@ -695,14 +705,22 @@ gethostbyaddr(addr, len, af) | |
292 | default: | |
293 | abort(); | |
294 | } | |
295 | - n = res_nquery(&_res, qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf); | |
296 | + buf = (querybuf *) malloc (sizeof (*buf)); | |
297 | + if (buf == NULL) { | |
298 | + __set_h_errno (NETDB_INTERNAL); | |
299 | + return NULL; | |
300 | + } | |
301 | + n = res_nquery(&_res, qbuf, C_IN, T_PTR, buf->buf, sizeof buf->buf); | |
302 | if (n < 0) { | |
303 | + free (buf); | |
304 | dprintf("res_nquery failed (%d)\n", n); | |
305 | if (errno == ECONNREFUSED) | |
306 | return (_gethtbyaddr(addr, len, af)); | |
307 | return (NULL); | |
308 | } | |
309 | - if (!(hp = getanswer(&buf, n, qbuf, T_PTR))) | |
310 | + hp = getanswer(buf, n, qbuf, T_PTR); | |
311 | + free (buf); | |
312 | + if (!hp) | |
313 | return (NULL); /* h_errno was set by getanswer() */ | |
314 | #ifdef SUNSECURITY | |
315 | if (af == AF_INET) { |