diff options
author | Daniel Stenberg <daniel@haxx.se> | 2008-02-11 22:03:31 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2008-02-11 22:03:31 +0000 |
commit | fcc320ee404606b7f9d4d140e7770a0f8dd2754d (patch) | |
tree | 6de4df1001ba130d74af3790c30bf0f34feabde7 /lib | |
parent | dc9fe9c3610fe96554978d4b2f6090ac7887ef79 (diff) |
Yang Tse pointed out a few remaining quirks from my timeout refactoring from
Feb 7 that didn't abort properly on timeouts. These are actually old
problems but now they should be fixed.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/qssl.c | 9 | ||||
-rw-r--r-- | lib/socks.c | 12 | ||||
-rw-r--r-- | lib/tftp.c | 26 |
3 files changed, 38 insertions, 9 deletions
diff --git a/lib/qssl.c b/lib/qssl.c index e65a0e2f6..d89f01730 100644 --- a/lib/qssl.c +++ b/lib/qssl.c @@ -175,8 +175,13 @@ static CURLcode Curl_qsossl_handshake(struct connectdata * conn, int sockindex) /* figure out how long time we should wait at maximum */ timeout_ms = Curl_timeleft(conn, NULL, TRUE); - /* SSL_Handshake() timeout resolution is second, so round up. */ + if(timeout_ms < 0) { + /* time-out, bail out, go home */ + failf(data, "Connection time-out"); + return CURLE_OPERATION_TIMEDOUT; + } + /* SSL_Handshake() timeout resolution is second, so round up. */ h->timeout = (timeout_ms + 1000 - 1) / 1000; /* Set-up protocol. */ @@ -429,7 +434,7 @@ ssize_t Curl_qsossl_recv(struct connectdata * conn, int num, char * buf, case SSL_ERROR_IO: switch (errno) { case EWOULDBLOCK: - *wouldblock = TRUE; + *wouldblock = TRUE; return -1; } diff --git a/lib/socks.c b/lib/socks.c index b78a04a45..06a513e80 100644 --- a/lib/socks.c +++ b/lib/socks.c @@ -140,6 +140,12 @@ CURLcode Curl_SOCKS4(const char *proxy_name, /* get timeout */ timeout = Curl_timeleft(conn, NULL, TRUE); + if(timeout < 0) { + /* time-out, bail out, go home */ + failf(data, "Connection time-out"); + return CURLE_OPERATION_TIMEDOUT; + } + Curl_nonblock(sock, FALSE); /* @@ -394,6 +400,12 @@ CURLcode Curl_SOCKS5(const char *proxy_name, /* get timeout */ timeout = Curl_timeleft(conn, NULL, TRUE); + if(timeout < 0) { + /* time-out, bail out, go home */ + failf(data, "Connection time-out"); + return CURLE_OPERATION_TIMEDOUT; + } + Curl_nonblock(sock, TRUE); /* wait until socket gets connected */ diff --git a/lib/tftp.c b/lib/tftp.c index 8b3656cdf..ffd668c19 100644 --- a/lib/tftp.c +++ b/lib/tftp.c @@ -189,16 +189,24 @@ const struct Curl_handler Curl_handler_tftp = { * * **********************************************************/ -static void tftp_set_timeouts(tftp_state_data_t *state) +static CURLcode tftp_set_timeouts(tftp_state_data_t *state) { time_t maxtime, timeout; long timeout_ms; time(&state->start_time); + /* Compute drop-dead time */ + timeout_ms = Curl_timeleft(state->conn, NULL, TRUE); + + if(timeout_ms < 0) { + /* time-out, bail out, go home */ + failf(state->conn->data, "Connection time-out"); + return CURLE_OPERATION_TIMEDOUT; + } + if(state->state == TFTP_STATE_START) { - /* Compute drop-dead time */ - timeout_ms = Curl_timeleft(state->conn, NULL, TRUE); + maxtime = (time_t)(timeout_ms + 500) / 1000; state->max_time = state->start_time+maxtime; @@ -219,8 +227,6 @@ static void tftp_set_timeouts(tftp_state_data_t *state) } else { - /* Compute drop-dead time */ - timeout_ms = Curl_timeleft(state->conn, NULL, TRUE); if(timeout_ms > 0) maxtime = (time_t)(timeout_ms + 500) / 1000; else @@ -250,6 +256,8 @@ static void tftp_set_timeouts(tftp_state_data_t *state) "set timeouts for state %d; Total %d, retry %d maxtry %d\n", state->state, (state->max_time-state->start_time), state->retry_time, state->retry_max); + + return CURLE_OK; } /********************************************************** @@ -343,13 +351,17 @@ static CURLcode tftp_send_first(tftp_state_data_t *state, tftp_event_t event) case TFTP_EVENT_ACK: /* Connected for transmit */ infof(data, "%s\n", "Connected for transmit"); state->state = TFTP_STATE_TX; - tftp_set_timeouts(state); + res = tftp_set_timeouts(state); + if(res) + break; return tftp_tx(state, event); case TFTP_EVENT_DATA: /* connected for receive */ infof(data, "%s\n", "Connected for receive"); state->state = TFTP_STATE_RX; - tftp_set_timeouts(state); + res = tftp_set_timeouts(state); + if(res) + break; return tftp_rx(state, event); case TFTP_EVENT_ERROR: |