summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorderaadt <>1997-05-28 21:40:11 +0000
committerderaadt <>1997-05-28 21:40:11 +0000
commita1c313b5e6f00ed4612d1aae0c2ee84171c64b12 (patch)
tree976575872a966ec5fd755856cd427e25c011bade /src
parent338dd5e3bd9186a615bf2c0e20ef71f54d963318 (diff)
downloadopenbsd-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.c21
-rw-r--r--src/lib/libc/net/res_send.c19
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)
37static char *rcsid = "$OpenBSD: rcmd.c,v 1.20 1997/04/05 21:13:15 millert Exp $"; 37static 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 }
178again: 182again:
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);
239bad2: 244bad2:
240 if (lport) 245 if (lport)
241 (void)close(*fd2p); 246 (void)close(*fd2p);
242bad: 247bad:
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 @@
60static char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93"; 60static char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93";
61static char rcsid[] = "$From: res_send.c,v 8.12 1996/10/08 04:51:06 vixie Exp $"; 61static char rcsid[] = "$From: res_send.c,v 8.12 1996/10/08 04:51:06 vixie Exp $";
62#else 62#else
63static char rcsid[] = "$OpenBSD: res_send.c,v 1.4 1997/03/13 19:07:41 downsj Exp $"; 63static 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;