summaryrefslogtreecommitdiff
path: root/misc.c
diff options
context:
space:
mode:
authordjm@openbsd.org <djm@openbsd.org>2020-06-26 05:16:38 +0000
committerDamien Miller <djm@mindrot.org>2020-06-26 15:25:24 +1000
commit3d06ff4bbd3dca8054c238d2a94c0da563ef7eee (patch)
tree8eb53997aaeaa09fe20f1f5b060b03c90f8f350f /misc.c
parentfe2ec0b9c19adeab0cd9f04b8152dc17f31c31e5 (diff)
upstream: handle EINTR in waitfd() and timeout_connect() helpers;
bz#3071; ok dtucker@ OpenBSD-Commit-ID: 08fa87be50070bd8b754d9b1ebb1138d7bc9d8ee
Diffstat (limited to 'misc.c')
-rw-r--r--misc.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/misc.c b/misc.c
index f29e9bc3a..4623b5755 100644
--- a/misc.c
+++ b/misc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: misc.c,v 1.152 2020/05/29 11:17:56 dtucker Exp $ */ 1/* $OpenBSD: misc.c,v 1.153 2020/06/26 05:16:38 djm Exp $ */
2/* 2/*
3 * Copyright (c) 2000 Markus Friedl. All rights reserved. 3 * Copyright (c) 2000 Markus Friedl. All rights reserved.
4 * Copyright (c) 2005-2020 Damien Miller. All rights reserved. 4 * Copyright (c) 2005-2020 Damien Miller. All rights reserved.
@@ -253,7 +253,7 @@ waitfd(int fd, int *timeoutp, short events)
253 errno = oerrno; 253 errno = oerrno;
254 if (r > 0) 254 if (r > 0)
255 return 0; 255 return 0;
256 else if (r == -1 && errno != EAGAIN) 256 else if (r == -1 && errno != EAGAIN && errno != EINTR)
257 return -1; 257 return -1;
258 else if (r == 0) 258 else if (r == 0)
259 break; 259 break;
@@ -292,12 +292,17 @@ timeout_connect(int sockfd, const struct sockaddr *serv_addr,
292 return connect(sockfd, serv_addr, addrlen); 292 return connect(sockfd, serv_addr, addrlen);
293 293
294 set_nonblock(sockfd); 294 set_nonblock(sockfd);
295 if (connect(sockfd, serv_addr, addrlen) == 0) { 295 for (;;) {
296 /* Succeeded already? */ 296 if (connect(sockfd, serv_addr, addrlen) == 0) {
297 unset_nonblock(sockfd); 297 /* Succeeded already? */
298 return 0; 298 unset_nonblock(sockfd);
299 } else if (errno != EINPROGRESS) 299 return 0;
300 return -1; 300 } else if (errno == EINTR)
301 continue;
302 else if (errno != EINPROGRESS)
303 return -1;
304 break;
305 }
301 306
302 if (waitfd(sockfd, timeoutp, POLLIN | POLLOUT) == -1) 307 if (waitfd(sockfd, timeoutp, POLLIN | POLLOUT) == -1)
303 return -1; 308 return -1;