summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjason <>2002-09-06 05:46:51 +0000
committerjason <>2002-09-06 05:46:51 +0000
commit86f7d34adeb180c6f13c1d0e85e5b603b3ccc1c2 (patch)
tree36d9e226e70c502caf8a66d4035ebd8d93e79f8b
parent5383fa10b90fae75038aefab3a0ef8f9dc3fd835 (diff)
downloadopenbsd-86f7d34adeb180c6f13c1d0e85e5b603b3ccc1c2.tar.gz
openbsd-86f7d34adeb180c6f13c1d0e85e5b603b3ccc1c2.tar.bz2
openbsd-86f7d34adeb180c6f13c1d0e85e5b603b3ccc1c2.zip
Pull in patch from current:
Fix (itojun): allocate 64K recieve buffer for DNS responses.
-rw-r--r--src/lib/libc/net/getaddrinfo.c51
-rw-r--r--src/lib/libc/net/gethostnamadr.c36
-rw-r--r--src/lib/libc/net/getnetnamadr.c37
3 files changed, 77 insertions, 47 deletions
diff --git a/src/lib/libc/net/getaddrinfo.c b/src/lib/libc/net/getaddrinfo.c
index d16900b4a0..5764b8c095 100644
--- a/src/lib/libc/net/getaddrinfo.c
+++ b/src/lib/libc/net/getaddrinfo.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: getaddrinfo.c,v 1.33 2002/02/17 19:42:23 millert Exp $ */ 1/* $OpenBSD: getaddrinfo.c,v 1.33.2.1 2002/09/06 05:46:51 jason Exp $ */
2/* $KAME: getaddrinfo.c,v 1.31 2000/08/31 17:36:43 itojun Exp $ */ 2/* $KAME: getaddrinfo.c,v 1.31 2000/08/31 17:36:43 itojun Exp $ */
3 3
4/* 4/*
@@ -179,11 +179,7 @@ static const struct explore explore[] = {
179#define PTON_MAX 4 179#define PTON_MAX 4
180#endif 180#endif
181 181
182#if PACKETSZ > 1024 182#define MAXPACKET (64*1024)
183#define MAXPACKET PACKETSZ
184#else
185#define MAXPACKET 1024
186#endif
187 183
188typedef union { 184typedef union {
189 HEADER hdr; 185 HEADER hdr;
@@ -1208,7 +1204,7 @@ _dns_getaddrinfo(name, pai)
1208 const struct addrinfo *pai; 1204 const struct addrinfo *pai;
1209{ 1205{
1210 struct addrinfo *ai; 1206 struct addrinfo *ai;
1211 querybuf buf, buf2; 1207 querybuf *buf, *buf2;
1212 struct addrinfo sentinel, *cur; 1208 struct addrinfo sentinel, *cur;
1213 struct res_target q, q2; 1209 struct res_target q, q2;
1214 1210
@@ -1217,47 +1213,66 @@ _dns_getaddrinfo(name, pai)
1217 memset(&sentinel, 0, sizeof(sentinel)); 1213 memset(&sentinel, 0, sizeof(sentinel));
1218 cur = &sentinel; 1214 cur = &sentinel;
1219 1215
1216 buf = malloc(sizeof(*buf));
1217 if (buf == NULL) {
1218 h_errno = NETDB_INTERNAL;
1219 return NULL;
1220 }
1221 buf2 = malloc(sizeof(*buf2));
1222 if (buf2 == NULL) {
1223 free(buf);
1224 h_errno = NETDB_INTERNAL;
1225 return NULL;
1226 }
1227
1220 switch (pai->ai_family) { 1228 switch (pai->ai_family) {
1221 case AF_UNSPEC: 1229 case AF_UNSPEC:
1222 /* prefer IPv6 */ 1230 /* prefer IPv6 */
1223 q.qclass = C_IN; 1231 q.qclass = C_IN;
1224 q.qtype = T_AAAA; 1232 q.qtype = T_AAAA;
1225 q.answer = buf.buf; 1233 q.answer = buf->buf;
1226 q.anslen = sizeof(buf); 1234 q.anslen = sizeof(buf->buf);
1227 q.next = &q2; 1235 q.next = &q2;
1228 q2.qclass = C_IN; 1236 q2.qclass = C_IN;
1229 q2.qtype = T_A; 1237 q2.qtype = T_A;
1230 q2.answer = buf2.buf; 1238 q2.answer = buf2->buf;
1231 q2.anslen = sizeof(buf2); 1239 q2.anslen = sizeof(buf2->buf);
1232 break; 1240 break;
1233 case AF_INET: 1241 case AF_INET:
1234 q.qclass = C_IN; 1242 q.qclass = C_IN;
1235 q.qtype = T_A; 1243 q.qtype = T_A;
1236 q.answer = buf.buf; 1244 q.answer = buf->buf;
1237 q.anslen = sizeof(buf); 1245 q.anslen = sizeof(buf->buf);
1238 break; 1246 break;
1239 case AF_INET6: 1247 case AF_INET6:
1240 q.qclass = C_IN; 1248 q.qclass = C_IN;
1241 q.qtype = T_AAAA; 1249 q.qtype = T_AAAA;
1242 q.answer = buf.buf; 1250 q.answer = buf->buf;
1243 q.anslen = sizeof(buf); 1251 q.anslen = sizeof(buf->buf);
1244 break; 1252 break;
1245 default: 1253 default:
1254 free(buf);
1255 free(buf2);
1246 return NULL; 1256 return NULL;
1247 } 1257 }
1248 if (res_searchN(name, &q) < 0) 1258 if (res_searchN(name, &q) < 0) {
1259 free(buf);
1260 free(buf2);
1249 return NULL; 1261 return NULL;
1250 ai = getanswer(&buf, q.n, q.name, q.qtype, pai); 1262 }
1263 ai = getanswer(buf, q.n, q.name, q.qtype, pai);
1251 if (ai) { 1264 if (ai) {
1252 cur->ai_next = ai; 1265 cur->ai_next = ai;
1253 while (cur && cur->ai_next) 1266 while (cur && cur->ai_next)
1254 cur = cur->ai_next; 1267 cur = cur->ai_next;
1255 } 1268 }
1256 if (q.next) { 1269 if (q.next) {
1257 ai = getanswer(&buf2, q2.n, q2.name, q2.qtype, pai); 1270 ai = getanswer(buf2, q2.n, q2.name, q2.qtype, pai);
1258 if (ai) 1271 if (ai)
1259 cur->ai_next = ai; 1272 cur->ai_next = ai;
1260 } 1273 }
1274 free(buf);
1275 free(buf2);
1261 return sentinel.ai_next; 1276 return sentinel.ai_next;
1262} 1277}
1263 1278
diff --git a/src/lib/libc/net/gethostnamadr.c b/src/lib/libc/net/gethostnamadr.c
index a3ec140a31..7e1dcdba7b 100644
--- a/src/lib/libc/net/gethostnamadr.c
+++ b/src/lib/libc/net/gethostnamadr.c
@@ -52,7 +52,7 @@
52 */ 52 */
53 53
54#if defined(LIBC_SCCS) && !defined(lint) 54#if defined(LIBC_SCCS) && !defined(lint)
55static char rcsid[] = "$OpenBSD: gethostnamadr.c,v 1.45.2.1 2002/06/26 06:03:49 millert Exp $"; 55static char rcsid[] = "$OpenBSD: gethostnamadr.c,v 1.45.2.2 2002/09/06 05:46:51 jason Exp $";
56#endif /* LIBC_SCCS and not lint */ 56#endif /* LIBC_SCCS and not lint */
57 57
58#include <sys/param.h> 58#include <sys/param.h>
@@ -110,11 +110,7 @@ int _hokchar(const char *);
110static const char AskedForGot[] = 110static const char AskedForGot[] =
111 "gethostby*.getanswer: asked for \"%s\", got \"%s\""; 111 "gethostby*.getanswer: asked for \"%s\", got \"%s\"";
112 112
113#if PACKETSZ > 1024 113#define MAXPACKET (64*1024)
114#define MAXPACKET PACKETSZ
115#else
116#define MAXPACKET 1024
117#endif
118 114
119typedef union { 115typedef union {
120 HEADER hdr; 116 HEADER hdr;
@@ -509,7 +505,7 @@ gethostbyname2(name, af)
509 const char *name; 505 const char *name;
510 int af; 506 int af;
511{ 507{
512 querybuf buf; 508 querybuf *buf;
513 register const char *cp; 509 register const char *cp;
514 char *bp, *ep; 510 char *bp, *ep;
515 int n, size, type, i; 511 int n, size, type, i;
@@ -627,15 +623,20 @@ gethostbyname2(name, af)
627 break; 623 break;
628#endif 624#endif
629 case 'b': 625 case 'b':
630 if ((n = res_search(name, C_IN, type, buf.buf, 626 buf = malloc(sizeof(*buf));
631 sizeof(buf))) < 0) { 627 if (buf == NULL)
628 break;
629 if ((n = res_search(name, C_IN, type, buf->buf,
630 sizeof(buf->buf))) < 0) {
631 free(buf);
632#ifdef DEBUG 632#ifdef DEBUG
633 if (_res.options & RES_DEBUG) 633 if (_res.options & RES_DEBUG)
634 printf("res_search failed\n"); 634 printf("res_search failed\n");
635#endif 635#endif
636 break; 636 break;
637 } 637 }
638 hp = getanswer(&buf, n, name, type); 638 hp = getanswer(buf, n, name, type);
639 free(buf);
639 break; 640 break;
640 case 'f': 641 case 'f':
641 hp = _gethtbyname2(name, af); 642 hp = _gethtbyname2(name, af);
@@ -653,7 +654,7 @@ gethostbyaddr(addr, len, af)
653{ 654{
654 const u_char *uaddr = (const u_char *)addr; 655 const u_char *uaddr = (const u_char *)addr;
655 int n, size, i; 656 int n, size, i;
656 querybuf buf; 657 querybuf *buf;
657 register struct hostent *hp; 658 register struct hostent *hp;
658 char qbuf[MAXDNAME+1], *qp; 659 char qbuf[MAXDNAME+1], *qp;
659 extern struct hostent *_gethtbyaddr(), *_yp_gethtbyaddr(); 660 extern struct hostent *_gethtbyaddr(), *_yp_gethtbyaddr();
@@ -729,17 +730,24 @@ gethostbyaddr(addr, len, af)
729 break; 730 break;
730#endif 731#endif
731 case 'b': 732 case 'b':
732 n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, 733 buf = malloc(sizeof(*buf));
733 sizeof buf.buf); 734 if (!buf)
735 break;
736 n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf->buf,
737 sizeof(buf->buf));
734 if (n < 0) { 738 if (n < 0) {
739 free(buf);
735#ifdef DEBUG 740#ifdef DEBUG
736 if (_res.options & RES_DEBUG) 741 if (_res.options & RES_DEBUG)
737 printf("res_query failed\n"); 742 printf("res_query failed\n");
738#endif 743#endif
739 break; 744 break;
740 } 745 }
741 if (!(hp = getanswer(&buf, n, qbuf, T_PTR))) 746 if (!(hp = getanswer(buf, n, qbuf, T_PTR))) {
747 free(buf);
742 break; 748 break;
749 }
750 free(buf);
743 hp->h_addrtype = af; 751 hp->h_addrtype = af;
744 hp->h_length = len; 752 hp->h_length = len;
745 bcopy(addr, host_addr, len); 753 bcopy(addr, host_addr, len);
diff --git a/src/lib/libc/net/getnetnamadr.c b/src/lib/libc/net/getnetnamadr.c
index 130cc220e8..1479b7575f 100644
--- a/src/lib/libc/net/getnetnamadr.c
+++ b/src/lib/libc/net/getnetnamadr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: getnetnamadr.c,v 1.15.2.1 2002/06/26 06:03:49 millert Exp $ */ 1/* $OpenBSD: getnetnamadr.c,v 1.15.2.2 2002/09/06 05:46:51 jason Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1997, Jason Downs. All rights reserved. 4 * Copyright (c) 1997, Jason Downs. All rights reserved.
@@ -77,7 +77,7 @@ static char sccsid[] = "@(#)getnetbyaddr.c 8.1 (Berkeley) 6/4/93";
77static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03"; 77static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03";
78static char rcsid[] = "$From: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $"; 78static char rcsid[] = "$From: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $";
79#else 79#else
80static char rcsid[] = "$OpenBSD: getnetnamadr.c,v 1.15.2.1 2002/06/26 06:03:49 millert Exp $"; 80static char rcsid[] = "$OpenBSD: getnetnamadr.c,v 1.15.2.2 2002/09/06 05:46:51 jason Exp $";
81#endif 81#endif
82#endif /* LIBC_SCCS and not lint */ 82#endif /* LIBC_SCCS and not lint */
83 83
@@ -94,6 +94,7 @@ static char rcsid[] = "$OpenBSD: getnetnamadr.c,v 1.15.2.1 2002/06/26 06:03:49 m
94#include <ctype.h> 94#include <ctype.h>
95#include <errno.h> 95#include <errno.h>
96#include <string.h> 96#include <string.h>
97#include <stdlib.h>
97 98
98extern int h_errno; 99extern int h_errno;
99 100
@@ -106,11 +107,7 @@ int _hokchar(const char *);
106#define BYNAME 1 107#define BYNAME 1
107#define MAXALIASES 35 108#define MAXALIASES 35
108 109
109#if PACKETSZ > 1024 110#define MAXPACKET (64*1024)
110#define MAXPACKET PACKETSZ
111#else
112#define MAXPACKET 1024
113#endif
114 111
115typedef union { 112typedef union {
116 HEADER hdr; 113 HEADER hdr;
@@ -252,7 +249,7 @@ getnetbyaddr(net, net_type)
252{ 249{
253 unsigned int netbr[4]; 250 unsigned int netbr[4];
254 int nn, anslen; 251 int nn, anslen;
255 querybuf buf; 252 querybuf *buf;
256 char qbuf[MAXDNAME]; 253 char qbuf[MAXDNAME];
257 in_addr_t net2; 254 in_addr_t net2;
258 struct netent *net_entry = NULL; 255 struct netent *net_entry = NULL;
@@ -300,16 +297,21 @@ getnetbyaddr(net, net_type)
300 netbr[3], netbr[2], netbr[1], netbr[0]); 297 netbr[3], netbr[2], netbr[1], netbr[0]);
301 break; 298 break;
302 } 299 }
303 anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, 300 buf = malloc(sizeof(*buf));
304 sizeof(buf)); 301 if (buf == NULL)
302 break;
303 anslen = res_query(qbuf, C_IN, T_PTR, buf->buf,
304 sizeof(buf->buf));
305 if (anslen < 0) { 305 if (anslen < 0) {
306 free(buf);
306#ifdef DEBUG 307#ifdef DEBUG
307 if (_res.options & RES_DEBUG) 308 if (_res.options & RES_DEBUG)
308 printf("res_query failed\n"); 309 printf("res_query failed\n");
309#endif 310#endif
310 break; 311 break;
311 } 312 }
312 net_entry = getnetanswer(&buf, anslen, BYADDR); 313 net_entry = getnetanswer(buf, anslen, BYADDR);
314 free(buf);
313 if (net_entry != NULL) { 315 if (net_entry != NULL) {
314 unsigned u_net = net; /* maybe net should be unsigned ? */ 316 unsigned u_net = net; /* maybe net should be unsigned ? */
315 317
@@ -336,7 +338,7 @@ getnetbyname(net)
336 register const char *net; 338 register const char *net;
337{ 339{
338 int anslen; 340 int anslen;
339 querybuf buf; 341 querybuf *buf;
340 char qbuf[MAXDNAME]; 342 char qbuf[MAXDNAME];
341 struct netent *net_entry = NULL; 343 struct netent *net_entry = NULL;
342 char lookups[MAXDNSLUS]; 344 char lookups[MAXDNSLUS];
@@ -358,16 +360,21 @@ getnetbyname(net)
358#endif /* YP */ 360#endif /* YP */
359 case 'b': 361 case 'b':
360 strlcpy(qbuf, net, sizeof qbuf); 362 strlcpy(qbuf, net, sizeof qbuf);
361 anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, 363 buf = malloc(sizeof(*buf));
362 sizeof(buf)); 364 if (buf == NULL)
365 break;
366 anslen = res_search(qbuf, C_IN, T_PTR, buf->buf,
367 sizeof(buf->buf));
363 if (anslen < 0) { 368 if (anslen < 0) {
369 free(buf);
364#ifdef DEBUG 370#ifdef DEBUG
365 if (_res.options & RES_DEBUG) 371 if (_res.options & RES_DEBUG)
366 printf("res_query failed\n"); 372 printf("res_query failed\n");
367#endif 373#endif
368 break; 374 break;
369 } 375 }
370 net_entry = getnetanswer(&buf, anslen, BYNAME); 376 net_entry = getnetanswer(buf, anslen, BYNAME);
377 free(buf);
371 if (net_entry != NULL) 378 if (net_entry != NULL)
372 return (net_entry); 379 return (net_entry);
373 break; 380 break;