summaryrefslogtreecommitdiffstats
path: root/usr.bin/ssh
diff options
context:
space:
mode:
authordjm <djm@openbsd.org>2020-06-26 05:16:38 +0000
committerdjm <djm@openbsd.org>2020-06-26 05:16:38 +0000
commitfa5ce6d1df348d64ada94058d5e518ea362af547 (patch)
tree3f8d1e94adf785aee932bae5da92e927390a4859 /usr.bin/ssh
parentregress test for ssh-add -d; ok dtucker@ (diff)
downloadwireguard-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.c21
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;