Commit fcc320ee authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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.
parent dc9fe9c3
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -6,6 +6,11 @@

                                  Changelog

Daniel S (11 Feb 2008)
- 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.

Yang Tse (10 Feb 2008)
- Bug report #1888932 (http://curl.haxx.se/bug/view.cgi?id=1888932) points out
  and provides test program that demonstrates that libcurl might not set error
+7 −2
Original line number Diff line number Diff line
@@ -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. */
+12 −0
Original line number Diff line number Diff line
@@ -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 */
+19 −7
Original line number Diff line number Diff line
@@ -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);

  if(state->state == TFTP_STATE_START) {
  /* 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) {

    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: