summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorderaadt <deraadt@openbsd.org>1997-05-28 21:38:57 +0000
committerderaadt <deraadt@openbsd.org>1997-05-28 21:38:57 +0000
commit4e0126524d108713f03690faf0d8db3488b32ea5 (patch)
tree85468fdf9b64b14f731d8ffddfb0974b8eb83d28
parentcd9660 spoof elsewhere (diff)
downloadwireguard-openbsd-4e0126524d108713f03690faf0d8db3488b32ea5.tar.xz
wireguard-openbsd-4e0126524d108713f03690faf0d8db3488b32ea5.zip
malloc fd_set dynamically, for very large fd uses
-rw-r--r--lib/libc/net/rcmd.c21
-rw-r--r--lib/libc/net/res_send.c19
2 files changed, 27 insertions, 13 deletions
diff --git a/lib/libc/net/rcmd.c b/lib/libc/net/rcmd.c
index a0adaf8ed0d..3c483a809bf 100644
--- a/lib/libc/net/rcmd.c
+++ b/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 <sys/param.h>
@@ -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/lib/libc/net/res_send.c b/lib/libc/net/res_send.c
index bfc01f9b6af..284f85d7fe9 100644
--- a/lib/libc/net/res_send.c
+++ b/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;