1 2002-10-09 Jakub Jelinek <jakub@redhat.com>
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.
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,
16 - querybuf host_buffer;
17 + querybuf *host_buffer;
18 char tmp[NS_MAXDNAME];
22 + enum nss_status status;
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)
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)
36 + return NSS_STATUS_UNAVAIL;
39 + n = res_nsearch (&_res, name, C_IN, type, host_buffer->buf,
40 + sizeof (host_buffer->buf));
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
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));
62 @@ -193,8 +204,10 @@ _nss_dns_gethostbyname2_r (const char *n
63 result->h_length = INADDRSZ;;
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);
75 @@ -232,7 +245,7 @@ _nss_dns_gethostbyaddr_r (const void *ad
76 char *h_addr_ptrs[MAX_NR_ADDRS + 1];
78 } *host_data = (struct host_data *) buffer;
79 - querybuf host_buffer;
80 + querybuf *host_buffer;
81 char qbuf[MAXDNAME+1], *qp;
84 @@ -289,17 +302,26 @@ _nss_dns_gethostbyaddr_r (const void *ad
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)
94 + return NSS_STATUS_UNAVAIL;
97 + n = res_nquery (&_res, qbuf, C_IN, T_PTR, host_buffer->buf,
98 + sizeof (host_buffer->buf));
103 + free (host_buffer);
104 return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
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)
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
119 /* Return entry for network with NAME. */
120 - querybuf net_buffer;
121 + querybuf *net_buffer;
124 + enum nss_status status;
126 if ((_res.options & RES_INIT) == 0 && __res_ninit (&_res) == -1)
127 return NSS_STATUS_UNAVAIL;
129 qbuf = strdupa (name);
130 - anslen = res_nsearch (&_res, qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
131 - sizeof (querybuf));
133 + net_buffer = (querybuf *) malloc (sizeof (querybuf));
134 + if (net_buffer == NULL)
137 + return NSS_STATUS_UNAVAIL;
140 + anslen = res_nsearch (&_res, qbuf, C_IN, T_PTR, net_buffer->buf,
141 + sizeof (net_buffer->buf));
147 return (errno == ECONNREFUSED
148 || errno == EPFNOSUPPORT
149 || errno == EAFNOSUPPORT)
150 ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
153 - return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME);
154 + status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME);
160 @@ -141,7 +153,7 @@ _nss_dns_getnetbyaddr_r (uint32_t net, i
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];
169 @@ -180,19 +192,28 @@ _nss_dns_getnetbyaddr_r (uint32_t net, i
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)
179 + return NSS_STATUS_UNAVAIL;
182 + anslen = res_nquery (&_res, qbuf, C_IN, T_PTR, net_buffer->buf,
183 + sizeof (net_buffer->buf));
189 return (errno == ECONNREFUSED
190 || errno == EPFNOSUPPORT
191 || errno == EAFNOSUPPORT)
192 ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
195 - status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR);
196 + status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR);
198 if (status == NSS_STATUS_SUCCESS)
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 */
207 - u_char buf[MAXPACKET];
209 HEADER *hp = (HEADER *) answer;
212 hp->rcode = NOERROR; /* default */
214 + buf = malloc (MAXPACKET);
216 + __set_h_errno (NETDB_INTERNAL);
221 if (statp->options & RES_DEBUG)
222 printf(";; res_query(%s, %d, %d)\n", name, class, type);
225 n = res_nmkquery(statp, QUERY, name, class, type, NULL, 0, NULL,
230 if (statp->options & RES_DEBUG)
231 printf(";; res_query: mkquery failed\n");
233 RES_SET_H_ERRNO(statp, NO_RECOVERY);
237 n = res_nsend(statp, buf, n, answer, anslen);
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)
250 register const char *cp;
252 int n, size, type, len;
253 + struct hostent *ret;
254 extern struct hostent *_gethtbyname2();
256 if ((_res.options & RES_INIT) == 0 && __res_ninit(&_res) == -1) {
257 @@ -615,13 +616,22 @@ gethostbyname2(name, af)
261 - if ((n = res_nsearch(&_res, name, C_IN, type, buf.buf, sizeof(buf.buf))) < 0) {
262 + buf = (querybuf *) malloc (sizeof (*buf));
264 + __set_h_errno (NETDB_INTERNAL);
268 + if ((n = res_nsearch(&_res, name, C_IN, type, buf->buf, sizeof(buf->buf))) < 0) {
270 dprintf("res_nsearch failed (%d)\n", n);
271 if (errno == ECONNREFUSED)
272 return (_gethtbyname2(name, af));
275 - return (getanswer(&buf, n, name, type));
276 + ret = getanswer(buf, n, name, type);
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 };
288 register struct hostent *hp;
289 char qbuf[MAXDNAME+1], *qp;
291 @@ -695,14 +705,22 @@ gethostbyaddr(addr, len, af)
295 - n = res_nquery(&_res, qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf);
296 + buf = (querybuf *) malloc (sizeof (*buf));
298 + __set_h_errno (NETDB_INTERNAL);
301 + n = res_nquery(&_res, qbuf, C_IN, T_PTR, buf->buf, sizeof buf->buf);
304 dprintf("res_nquery failed (%d)\n", n);
305 if (errno == ECONNREFUSED)
306 return (_gethtbyaddr(addr, len, af));
309 - if (!(hp = getanswer(&buf, n, qbuf, T_PTR)))
310 + hp = getanswer(buf, n, qbuf, T_PTR);
313 return (NULL); /* h_errno was set by getanswer() */