diff options
author | jason <> | 2002-09-06 05:46:51 +0000 |
---|---|---|
committer | jason <> | 2002-09-06 05:46:51 +0000 |
commit | 86f7d34adeb180c6f13c1d0e85e5b603b3ccc1c2 (patch) | |
tree | 36d9e226e70c502caf8a66d4035ebd8d93e79f8b | |
parent | 5383fa10b90fae75038aefab3a0ef8f9dc3fd835 (diff) | |
download | openbsd-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.c | 51 | ||||
-rw-r--r-- | src/lib/libc/net/gethostnamadr.c | 36 | ||||
-rw-r--r-- | src/lib/libc/net/getnetnamadr.c | 37 |
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 | ||
188 | typedef union { | 184 | typedef 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) |
55 | static char rcsid[] = "$OpenBSD: gethostnamadr.c,v 1.45.2.1 2002/06/26 06:03:49 millert Exp $"; | 55 | static 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 *); | |||
110 | static const char AskedForGot[] = | 110 | static 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 | ||
119 | typedef union { | 115 | typedef 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"; | |||
77 | static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03"; | 77 | static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03"; |
78 | static char rcsid[] = "$From: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $"; | 78 | static char rcsid[] = "$From: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $"; |
79 | #else | 79 | #else |
80 | static char rcsid[] = "$OpenBSD: getnetnamadr.c,v 1.15.2.1 2002/06/26 06:03:49 millert Exp $"; | 80 | static 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 | ||
98 | extern int h_errno; | 99 | extern 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 | ||
115 | typedef union { | 112 | typedef 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; |