From a1c313b5e6f00ed4612d1aae0c2ee84171c64b12 Mon Sep 17 00:00:00 2001 From: deraadt <> Date: Wed, 28 May 1997 21:40:11 +0000 Subject: malloc fd_set dynamically, for very large fd uses --- src/lib/libc/net/rcmd.c | 21 ++++++++++++++------- src/lib/libc/net/res_send.c | 19 +++++++++++++------ 2 files changed, 27 insertions(+), 13 deletions(-) (limited to 'src') 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 @@ */ #if defined(LIBC_SCCS) && !defined(lint) -static char *rcsid = "$OpenBSD: rcmd.c,v 1.20 1997/04/05 21:13:15 millert Exp $"; +static char *rcsid = "$OpenBSD: rcmd.c,v 1.21 1997/05/28 21:40:11 deraadt Exp $"; #endif /* LIBC_SCCS and not lint */ #include @@ -69,7 +69,7 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) { struct hostent *hp; struct sockaddr_in sin, from; - fd_set reads; + fd_set *readsp = NULL; int oldmask; pid_t pid; int s, lport, timo; @@ -166,6 +166,10 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) if (s2 < 0) goto bad; + readsp = (fd_set *)malloc(howmany(MAX(s, s2), NFDBITS) * + sizeof(fd_mask)); + if (readsp == NULL) + goto bad; listen(s2, 1); (void)snprintf(num, sizeof(num), "%d", lport); if (write(s, num, strlen(num)+1) != strlen(num)+1) { @@ -176,12 +180,12 @@ rcmd(ahost, rport, locuser, remuser, cmd, fd2p) goto bad; } again: - FD_ZERO(&reads); - FD_SET(s, &reads); - FD_SET(s2, &reads); + FD_ZERO(readsp); + FD_SET(s, readsp); + FD_SET(s2, readsp); errno = 0; - if (select(MAX(s, s2) + 1, &reads, 0, 0, 0) < 1 || - !FD_ISSET(s2, &reads)) { + if (select(MAX(s, s2) + 1, readsp, 0, 0, 0) < 1 || + !FD_ISSET(s2, readsp)) { if (errno != 0) (void)fprintf(stderr, "rcmd: select (setting up stderr): %s\n", @@ -235,11 +239,14 @@ again: goto bad2; } sigsetmask(oldmask); + free(readsp); return (s); bad2: if (lport) (void)close(*fd2p); bad: + if (readsp) + free(readsp); (void)close(s); sigsetmask(oldmask); 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 @@ -/* $OpenBSD: res_send.c,v 1.4 1997/03/13 19:07:41 downsj Exp $ */ +/* $OpenBSD: res_send.c,v 1.5 1997/05/28 21:38:57 deraadt Exp $ */ /* * ++Copyright++ 1985, 1989, 1993 @@ -60,7 +60,7 @@ static char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93"; static char rcsid[] = "$From: res_send.c,v 8.12 1996/10/08 04:51:06 vixie Exp $"; #else -static char rcsid[] = "$OpenBSD: res_send.c,v 1.4 1997/03/13 19:07:41 downsj Exp $"; +static char rcsid[] = "$OpenBSD: res_send.c,v 1.5 1997/05/28 21:38:57 deraadt Exp $"; #endif #endif /* LIBC_SCCS and not lint */ @@ -489,7 +489,7 @@ read_len: * Use datagrams. */ struct timeval timeout; - fd_set dsmask; + fd_set *dsmaskp; struct sockaddr_in from; int fromlen; @@ -595,10 +595,17 @@ read_len: timeout.tv_sec = 1; timeout.tv_usec = 0; wait: - FD_ZERO(&dsmask); - FD_SET(s, &dsmask); - n = select(s+1, &dsmask, (fd_set *)NULL, + dsmaskp = (fd_set *)malloc(howmany(s, NFDBITS) * + sizeof(fd_mask)); + if (dsmaskp == NULL) { + res_close(); + goto next_ns; + } + FD_ZERO(dsmaskp); + FD_SET(s, dsmaskp); + n = select(s+1, dsmaskp, (fd_set *)NULL, (fd_set *)NULL, &timeout); + free(dsmaskp); if (n < 0) { if (errno == EINTR) goto wait; -- cgit v1.2.3-55-g6feb