diff options
| -rw-r--r-- | lib/ssluse.c | 35 | 
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", | 
