diff options
author | djm@openbsd.org <djm@openbsd.org> | 2020-06-26 05:16:38 +0000 |
---|---|---|
committer | Damien Miller <djm@mindrot.org> | 2020-06-26 15:25:24 +1000 |
commit | 3d06ff4bbd3dca8054c238d2a94c0da563ef7eee (patch) | |
tree | 8eb53997aaeaa09fe20f1f5b060b03c90f8f350f /misc.c | |
parent | fe2ec0b9c19adeab0cd9f04b8152dc17f31c31e5 (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.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -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; |