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

timediff: return timediff_t from the time diff functions

... to cater for systems with unsigned time_t variables.

- Renamed the functions to curlx_timediff and Curl_timediff_us.

- Added overflow protection for both of them in either direction for
  both 32 bit and 64 bit time_ts

- Reprefixed the curlx_time functions to use Curl_*

Reported-by: Peter Piekarski
Fixes #2004
Closes #2005
parent 016c6a6a
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -401,7 +401,7 @@ CURLcode Curl_resolver_wait_resolv(struct connectdata *conn,
      result = CURLE_ABORTED_BY_CALLBACK;
    else {
      struct curltime now2 = Curl_tvnow();
      time_t timediff = Curl_tvdiff(now2, now); /* spent time */
      timediff_t timediff = Curl_timediff(now2, now); /* spent time */
      if(timediff <= 0)
        timeout -= 1; /* always deduct at least 1 */
      else if(timediff > timeout)
+2 −1
Original line number Diff line number Diff line
@@ -535,7 +535,8 @@ CURLcode Curl_resolver_is_resolved(struct connectdata *conn,
  }
  else {
    /* poll for name lookup done with exponential backoff up to 250ms */
    time_t elapsed = Curl_tvdiff(Curl_tvnow(), data->progress.t_startsingle);
    timediff_t elapsed = Curl_timediff(Curl_tvnow(),
                                       data->progress.t_startsingle);
    if(elapsed < 0)
      elapsed = 0;

+4 −4
Original line number Diff line number Diff line
@@ -225,10 +225,10 @@ time_t Curl_timeleft(struct Curl_easy *data,
  /* subtract elapsed time */
  if(duringconnect)
    /* since this most recent connect started */
    timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startsingle);
    timeout_ms -= Curl_timediff(*nowp, data->progress.t_startsingle);
  else
    /* since the entire operation started */
    timeout_ms -= Curl_tvdiff(*nowp, data->progress.t_startop);
    timeout_ms -= Curl_timediff(*nowp, data->progress.t_startop);
  if(!timeout_ms)
    /* avoid returning 0 as that means no timeout! */
    return -1;
@@ -765,7 +765,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,

    if(rc == 0) { /* no connection yet */
      error = 0;
      if(curlx_tvdiff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
      if(Curl_timediff(now, conn->connecttime) >= conn->timeoutms_per_addr) {
        infof(data, "After %ldms connect time, move on!\n",
              conn->timeoutms_per_addr);
        error = ETIMEDOUT;
@@ -773,7 +773,7 @@ CURLcode Curl_is_connected(struct connectdata *conn,

      /* should we try another protocol family? */
      if(i == 0 && conn->tempaddr[1] == NULL &&
         curlx_tvdiff(now, conn->connecttime) >= HAPPY_EYEBALLS_TIMEOUT) {
         Curl_timediff(now, conn->connecttime) >= HAPPY_EYEBALLS_TIMEOUT) {
        trynextip(conn, sockindex, 1);
      }
    }
+6 −6
Original line number Diff line number Diff line
@@ -586,12 +586,12 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
    }

    /* get the time stamp to use to figure out how long poll takes */
    before = curlx_tvnow();
    before = Curl_tvnow();

    /* wait for activity or timeout */
    pollrc = Curl_poll(fds, numfds, (int)ev->ms);

    after = curlx_tvnow();
    after = Curl_tvnow();

    ev->msbump = FALSE; /* reset here */

@@ -619,7 +619,7 @@ static CURLcode wait_or_timeout(struct Curl_multi *multi, struct events *ev)
        /* If nothing updated the timeout, we decrease it by the spent time.
         * If it was updated, it has the new timeout time stored already.
         */
        time_t timediff = curlx_tvdiff(after, before);
        timediff_t timediff = Curl_timediff(after, before);
        if(timediff > 0) {
          if(timediff > ev->ms)
            ev->ms = 0;
@@ -680,17 +680,17 @@ static CURLcode easy_transfer(struct Curl_multi *multi)
    int still_running = 0;
    int rc;

    before = curlx_tvnow();
    before = Curl_tvnow();
    mcode = curl_multi_wait(multi, NULL, 0, 1000, &rc);

    if(!mcode) {
      if(!rc) {
        struct curltime after = curlx_tvnow();
        struct curltime after = Curl_tvnow();

        /* If it returns without any filedescriptor instantly, we need to
           avoid busy-looping during periods where it has nothing particular
           to wait for */
        if(curlx_tvdiff(after, before) <= 10) {
        if(Curl_timediff(after, before) <= 10) {
          without_fds++;
          if(without_fds > 2) {
            int sleep_ms = without_fds < 10 ? (1 << (without_fds - 1)) : 1000;
+1 −1
Original line number Diff line number Diff line
@@ -351,7 +351,7 @@ static time_t ftp_timeleft_accept(struct Curl_easy *data)
    timeout_ms = other;
  else {
    /* subtract elapsed time */
    timeout_ms -= Curl_tvdiff(now, data->progress.t_acceptdata);
    timeout_ms -= Curl_timediff(now, data->progress.t_acceptdata);
    if(!timeout_ms)
      /* avoid returning 0 as that means no timeout! */
      return -1;
Loading