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:
parent
86ba2e6339
commit
e2452f3bd0
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user