aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2010-11-14 12:42:29 +0100
committerDaniel Stenberg <daniel@haxx.se>2010-11-14 12:42:29 +0100
commitcbf4961bf3e42d88f6489f981efd509faa86f501 (patch)
tree10755978df1363c0862d39c249a3cdb06fc21fe5 /lib
parentadd5766dd4d8a15f3f96254fc65e9ab5c9ff3d48 (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
Diffstat (limited to 'lib')
-rw-r--r--lib/gtls.c19
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;