1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 01:48:00 +00:00

Add some missing checks for EINTR after select(2).

I noticed today that Unix Plink responds to SIGWINCH by accidentally
dying of EINTR having interrupted its main select loop, and when I
checked, there turn out to be a couple of other select loops with the
same bug.
This commit is contained in:
Simon Tatham 2017-01-06 19:29:06 +00:00
parent 86ba2e6339
commit e2452f3bd0
3 changed files with 9 additions and 2 deletions

View File

@ -101,7 +101,9 @@ static int block_and_read(int fd, void *buf, size_t len)
fd_set rfds;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
ret = select(fd+1, &rfds, NULL, NULL, NULL);
do {
ret = select(fd+1, &rfds, NULL, NULL, NULL);
} while (ret < 0 && errno == EINTR);
assert(ret != 0);
if (ret < 0)
return ret;

View File

@ -1122,6 +1122,9 @@ int main(int argc, char **argv)
ret = select(maxfd, &rset, &wset, &xset, NULL);
}
if (ret < 0 && errno == EINTR)
continue;
if (ret < 0) {
perror("select");
exit(1);

View File

@ -531,7 +531,9 @@ static int ssh_sftp_do_select(int include_stdin, int no_fds_ok)
now = GETTICKCOUNT();
} while (ret < 0 && errno == EINTR);
} else {
ret = select(maxfd, &rset, &wset, &xset, NULL);
do {
ret = select(maxfd, &rset, &wset, &xset, NULL);
} while (ret < 0 && errno == EINTR);
}
} while (ret == 0);