diff options
author | djm <djm@openbsd.org> | 2020-06-26 05:16:38 +0000 |
---|---|---|
committer | djm <djm@openbsd.org> | 2020-06-26 05:16:38 +0000 |
commit | fa5ce6d1df348d64ada94058d5e518ea362af547 (patch) | |
tree | 3f8d1e94adf785aee932bae5da92e927390a4859 /usr.bin/ssh | |
parent | regress test for ssh-add -d; ok dtucker@ (diff) | |
download | wireguard-openbsd-fa5ce6d1df348d64ada94058d5e518ea362af547.tar.xz wireguard-openbsd-fa5ce6d1df348d64ada94058d5e518ea362af547.zip |
handle EINTR in waitfd() and timeout_connect() helpers;
bz#3071; ok dtucker@
Diffstat (limited to 'usr.bin/ssh')
-rw-r--r-- | usr.bin/ssh/misc.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/usr.bin/ssh/misc.c b/usr.bin/ssh/misc.c index ec869aea41b..c63f4672ef7 100644 --- a/usr.bin/ssh/misc.c +++ b/usr.bin/ssh/misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.152 2020/05/29 11:17:56 dtucker Exp $ */ +/* $OpenBSD: misc.c,v 1.153 2020/06/26 05:16:38 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2005-2020 Damien Miller. All rights reserved. @@ -226,7 +226,7 @@ waitfd(int fd, int *timeoutp, short events) errno = oerrno; if (r > 0) return 0; - else if (r == -1 && errno != EAGAIN) + else if (r == -1 && errno != EAGAIN && errno != EINTR) return -1; else if (r == 0) break; @@ -265,12 +265,17 @@ timeout_connect(int sockfd, const struct sockaddr *serv_addr, return connect(sockfd, serv_addr, addrlen); set_nonblock(sockfd); - if (connect(sockfd, serv_addr, addrlen) == 0) { - /* Succeeded already? */ - unset_nonblock(sockfd); - return 0; - } else if (errno != EINPROGRESS) - return -1; + for (;;) { + if (connect(sockfd, serv_addr, addrlen) == 0) { + /* Succeeded already? */ + unset_nonblock(sockfd); + return 0; + } else if (errno == EINTR) + continue; + else if (errno != EINPROGRESS) + return -1; + break; + } if (waitfd(sockfd, timeoutp, POLLIN | POLLOUT) == -1) return -1; |