diff options
author | deraadt <> | 1997-05-28 21:40:11 +0000 |
---|---|---|
committer | deraadt <> | 1997-05-28 21:40:11 +0000 |
commit | a1c313b5e6f00ed4612d1aae0c2ee84171c64b12 (patch) | |
tree | 976575872a966ec5fd755856cd427e25c011bade /src/lib/libc/net/res_send.c | |
parent | 338dd5e3bd9186a615bf2c0e20ef71f54d963318 (diff) | |
download | openbsd-a1c313b5e6f00ed4612d1aae0c2ee84171c64b12.tar.gz openbsd-a1c313b5e6f00ed4612d1aae0c2ee84171c64b12.tar.bz2 openbsd-a1c313b5e6f00ed4612d1aae0c2ee84171c64b12.zip |
malloc fd_set dynamically, for very large fd uses
Diffstat (limited to 'src/lib/libc/net/res_send.c')
-rw-r--r-- | src/lib/libc/net/res_send.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/src/lib/libc/net/res_send.c b/src/lib/libc/net/res_send.c index bfc01f9b6a..284f85d7fe 100644 --- a/src/lib/libc/net/res_send.c +++ b/src/lib/libc/net/res_send.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: res_send.c,v 1.4 1997/03/13 19:07:41 downsj Exp $ */ | 1 | /* $OpenBSD: res_send.c,v 1.5 1997/05/28 21:38:57 deraadt Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * ++Copyright++ 1985, 1989, 1993 | 4 | * ++Copyright++ 1985, 1989, 1993 |
@@ -60,7 +60,7 @@ | |||
60 | static char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93"; | 60 | static char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93"; |
61 | static char rcsid[] = "$From: res_send.c,v 8.12 1996/10/08 04:51:06 vixie Exp $"; | 61 | static char rcsid[] = "$From: res_send.c,v 8.12 1996/10/08 04:51:06 vixie Exp $"; |
62 | #else | 62 | #else |
63 | static char rcsid[] = "$OpenBSD: res_send.c,v 1.4 1997/03/13 19:07:41 downsj Exp $"; | 63 | static char rcsid[] = "$OpenBSD: res_send.c,v 1.5 1997/05/28 21:38:57 deraadt Exp $"; |
64 | #endif | 64 | #endif |
65 | #endif /* LIBC_SCCS and not lint */ | 65 | #endif /* LIBC_SCCS and not lint */ |
66 | 66 | ||
@@ -489,7 +489,7 @@ read_len: | |||
489 | * Use datagrams. | 489 | * Use datagrams. |
490 | */ | 490 | */ |
491 | struct timeval timeout; | 491 | struct timeval timeout; |
492 | fd_set dsmask; | 492 | fd_set *dsmaskp; |
493 | struct sockaddr_in from; | 493 | struct sockaddr_in from; |
494 | int fromlen; | 494 | int fromlen; |
495 | 495 | ||
@@ -595,10 +595,17 @@ read_len: | |||
595 | timeout.tv_sec = 1; | 595 | timeout.tv_sec = 1; |
596 | timeout.tv_usec = 0; | 596 | timeout.tv_usec = 0; |
597 | wait: | 597 | wait: |
598 | FD_ZERO(&dsmask); | 598 | dsmaskp = (fd_set *)malloc(howmany(s, NFDBITS) * |
599 | FD_SET(s, &dsmask); | 599 | sizeof(fd_mask)); |
600 | n = select(s+1, &dsmask, (fd_set *)NULL, | 600 | if (dsmaskp == NULL) { |
601 | res_close(); | ||
602 | goto next_ns; | ||
603 | } | ||
604 | FD_ZERO(dsmaskp); | ||
605 | FD_SET(s, dsmaskp); | ||
606 | n = select(s+1, dsmaskp, (fd_set *)NULL, | ||
601 | (fd_set *)NULL, &timeout); | 607 | (fd_set *)NULL, &timeout); |
608 | free(dsmaskp); | ||
602 | if (n < 0) { | 609 | if (n < 0) { |
603 | if (errno == EINTR) | 610 | if (errno == EINTR) |
604 | goto wait; | 611 | goto wait; |