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 | |
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')
-rw-r--r-- | src/lib/libc/net/rcmd.c | 21 | ||||
-rw-r--r-- | src/lib/libc/net/res_send.c | 19 |
2 files changed, 27 insertions, 13 deletions
diff --git a/src/lib/libc/net/rcmd.c b/src/lib/libc/net/rcmd.c index a0adaf8ed0..3c483a809b 100644 --- a/src/lib/libc/net/rcmd.c +++ b/src/lib/libc/net/rcmd.c | |||
@@ -34,7 +34,7 @@ | |||
34 | */ | 34 | */ |
35 | 35 | ||
36 | #if defined(LIBC_SCCS) && !defined(lint) | 36 | #if defined(LIBC_SCCS) && !defined(lint) |
37 | static char *rcsid = "$OpenBSD: rcmd.c,v 1.20 1997/04/05 21:13:15 millert Exp $"; | 37 | static char *rcsid = "$OpenBSD: rcmd.c,v 1.21 1997/05/28 21:40:11 deraadt Exp $"; |
38 | #endif /* LIBC_SCCS and not lint */ | 38 | #endif /* LIBC_SCCS and not lint */ |
39 | 39 | ||
40 | #include <sys/param.h> | 40 | #include <sys/param.h> |
@@ -69,7 +69,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) | |||
69 | { | 69 | { |
70 | struct hostent *hp; | 70 | struct hostent *hp; |
71 | struct sockaddr_in sin, from; | 71 | struct sockaddr_in sin, from; |
72 | fd_set reads; | 72 | fd_set *readsp = NULL; |
73 | int oldmask; | 73 | int oldmask; |
74 | pid_t pid; | 74 | pid_t pid; |
75 | int s, lport, timo; | 75 | int s, lport, timo; |
@@ -166,6 +166,10 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) | |||
166 | 166 | ||
167 | if (s2 < 0) | 167 | if (s2 < 0) |
168 | goto bad; | 168 | goto bad; |
169 | readsp = (fd_set *)malloc(howmany(MAX(s, s2), NFDBITS) * | ||
170 | sizeof(fd_mask)); | ||
171 | if (readsp == NULL) | ||
172 | goto bad; | ||
169 | listen(s2, 1); | 173 | listen(s2, 1); |
170 | (void)snprintf(num, sizeof(num), "%d", lport); | 174 | (void)snprintf(num, sizeof(num), "%d", lport); |
171 | if (write(s, num, strlen(num)+1) != strlen(num)+1) { | 175 | if (write(s, num, strlen(num)+1) != strlen(num)+1) { |
@@ -176,12 +180,12 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) | |||
176 | goto bad; | 180 | goto bad; |
177 | } | 181 | } |
178 | again: | 182 | again: |
179 | FD_ZERO(&reads); | 183 | FD_ZERO(readsp); |
180 | FD_SET(s, &reads); | 184 | FD_SET(s, readsp); |
181 | FD_SET(s2, &reads); | 185 | FD_SET(s2, readsp); |
182 | errno = 0; | 186 | errno = 0; |
183 | if (select(MAX(s, s2) + 1, &reads, 0, 0, 0) < 1 || | 187 | if (select(MAX(s, s2) + 1, readsp, 0, 0, 0) < 1 || |
184 | !FD_ISSET(s2, &reads)) { | 188 | !FD_ISSET(s2, readsp)) { |
185 | if (errno != 0) | 189 | if (errno != 0) |
186 | (void)fprintf(stderr, | 190 | (void)fprintf(stderr, |
187 | "rcmd: select (setting up stderr): %s\n", | 191 | "rcmd: select (setting up stderr): %s\n", |
@@ -235,11 +239,14 @@ again: | |||
235 | goto bad2; | 239 | goto bad2; |
236 | } | 240 | } |
237 | sigsetmask(oldmask); | 241 | sigsetmask(oldmask); |
242 | free(readsp); | ||
238 | return (s); | 243 | return (s); |
239 | bad2: | 244 | bad2: |
240 | if (lport) | 245 | if (lport) |
241 | (void)close(*fd2p); | 246 | (void)close(*fd2p); |
242 | bad: | 247 | bad: |
248 | if (readsp) | ||
249 | free(readsp); | ||
243 | (void)close(s); | 250 | (void)close(s); |
244 | sigsetmask(oldmask); | 251 | sigsetmask(oldmask); |
245 | return (-1); | 252 | return (-1); |
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; |