diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2010-11-14 12:42:29 +0100 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2010-11-14 12:42:29 +0100 | 
| commit | cbf4961bf3e42d88f6489f981efd509faa86f501 (patch) | |
| tree | 10755978df1363c0862d39c249a3cdb06fc21fe5 | |
| parent | add5766dd4d8a15f3f96254fc65e9ab5c9ff3d48 (diff) | |
gnutls->handshake: improved timeout handling
When no timeout is set, we call the socket_ready function with a timeout
value of 0 during handshake, which makes it loop too much/fast in this
function. It also made this function return CURLE_OPERATION_TIMEDOUT
wrongly on a slow handshake.
However, the particular bug report that highlighted this problem is not
solved by this fix, as this fix only makes the more proper error get
reported instead.
Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=594150
Reported by: Johannes Ernst
| -rw-r--r-- | lib/gtls.c | 19 | 
1 files changed, 10 insertions, 9 deletions
diff --git a/lib/gtls.c b/lib/gtls.c index fca2a7e7d..84410eda8 100644 --- a/lib/gtls.c +++ b/lib/gtls.c @@ -216,19 +216,18 @@ static CURLcode handshake(struct connectdata *conn,          connssl->connecting_state?sockfd:CURL_SOCKET_BAD;        what = Curl_socket_ready(readfd, writefd, -                               nonblocking?0:(int)timeout_ms); +                               nonblocking?0:(int)timeout_ms?1000:timeout_ms);        if(what < 0) {          /* fatal error */          failf(data, "select/poll on SSL socket, errno: %d", SOCKERRNO);          return CURLE_SSL_CONNECT_ERROR;        }        else if(0 == what) { -        if(nonblocking) { +        if(nonblocking)            return CURLE_OK; -        } -        else { +        else if(timeout_ms) {            /* timeout */ -          failf(data, "SSL connection timeout"); +          failf(data, "SSL connection timeout at %ld", timeout_ms);            return CURLE_OPERATION_TIMEDOUT;          }        } @@ -241,12 +240,14 @@ static CURLcode handshake(struct connectdata *conn,        connssl->connecting_state =          gnutls_record_get_direction(session)?          ssl_connect_2_writing:ssl_connect_2_reading; -      if(nonblocking) { +      if(nonblocking)          return CURLE_OK; -      } -    } else if (rc < 0) { +    } +    else if (rc < 0) {        failf(data, "gnutls_handshake() failed: %s", gnutls_strerror(rc)); -    } else { +      return CURLE_SSL_CONNECT_ERROR; +    } +    else {        /* Reset our connect state machine */        connssl->connecting_state = ssl_connect_1;        return CURLE_OK;  | 
