aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/ssluse.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/lib/ssluse.c b/lib/ssluse.c
index b2f1e82e6..f91b79a70 100644
--- a/lib/ssluse.c
+++ b/lib/ssluse.c
@@ -44,6 +44,7 @@
#include "url.h" /* for the ssl config check function */
#include "inet_pton.h"
#include "ssluse.h"
+#include "connect.h" /* Curl_ourerrno() proto */
#ifdef USE_SSLEAY
#include <openssl/rand.h>
@@ -1157,18 +1158,28 @@ Curl_SSLConnect(struct connectdata *conn,
interval.tv_usec = timeout_ms*1000;
- what = select(sockfd+1, &readfd, &writefd, NULL, &interval);
- if(what > 0)
- /* reabable or writable, go loop yourself */
- continue;
- else if(0 == what) {
- /* timeout */
- failf(data, "SSL connection timeout");
- return CURLE_OPERATION_TIMEOUTED;
- }
- else
- break; /* get out of loop */
- } /* loop */
+ while(1) {
+ what = select(sockfd+1, &readfd, &writefd, NULL, &interval);
+ if(what > 0)
+ /* reabable or writable, go loop in the outer loop */
+ break;
+ else if(0 == what) {
+ /* timeout */
+ failf(data, "SSL connection timeout");
+ return CURLE_OPERATION_TIMEDOUT;
+ }
+ else {
+#ifdef EINTR
+ /* For platforms without EINTR all errnos are bad */
+ if (errno == EINTR)
+ continue; /* retry the select() */
+#endif
+ /* anything other than the unimportant EINTR is fatally bad */
+ failf(data, "select on SSL socket, errno: %d", Curl_ourerrno());
+ return CURLE_SSL_CONNECT_ERROR;
+ }
+ } /* while()-loop for the select() */
+ } /* while()-loop for the SSL_connect() */
/* Informational message */
infof (data, "SSL connection using %s\n",