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)) {