From: Todd C. Miller <Todd.Miller@courtesan.com>
Date: Fri, 23 Jan 1998 03:53:52 +0000 (+0000)
Subject: fix select usage for high fd's (dynamically allocate readfds)
X-Git-Tag: SUDO_1_5_6~109
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e8cf35a7b4ed3eb7c89a4f922d53b569d68fd2d;p=sudo

fix select usage for high fd's (dynamically allocate readfds)
---

diff --git a/tgetpass.c b/tgetpass.c
index e91435cab..f8c950485 100644
--- a/tgetpass.c
+++ b/tgetpass.c
@@ -114,7 +114,7 @@ char * tgetpass(prompt, timeout, user, host)
     int n, echo;
     FILE *input, *output;
     static char buf[_PASSWD_LEN + 1];
-    fd_set readfds;
+    fd_set *readfds;
     struct timeval tv;
     char *p;
 
@@ -199,8 +199,14 @@ char * tgetpass(prompt, timeout, user, host)
      */
     if (timeout > 0) {
 	/* setup for select(2) */
-	FD_ZERO(&readfds);
-	FD_SET(fileno(input), &readfds);
+	n = howmany(fileno(input) + 1, NFDBITS) * sizeof(fd_mask);
+	if ((readfds = (fd_set *) malloc(n)) == NULL) {
+	    (void) fprintf(stderr, "Cannot allocate memory: ");
+	    perror("");
+	    return(NULL);
+	}
+	(void) memset((VOID *)readfds, 0, n);
+	FD_SET(fileno(input), readfds);
 
 	/* set timeout for select */
 	tv.tv_sec = timeout;
@@ -210,12 +216,13 @@ char * tgetpass(prompt, timeout, user, host)
 	 * get password or return empty string if nothing to read by timeout
 	 */
 	buf[0] = '\0';
-	if (select(fileno(input) + 1, &readfds, 0, 0, &tv) > 0 &&
+	if (select(fileno(input) + 1, readfds, 0, 0, &tv) > 0 &&
 	    fgets(buf, sizeof(buf), input)) {
 	    n = strlen(buf);
 	    if (buf[n - 1] == '\n')
 		buf[n - 1] = '\0';
 	}
+	(void) free(readfds);
     } else {
 	buf[0] = '\0';
 	if (fgets(buf, sizeof(buf), input)) {