]> granicus.if.org Git - curl/commitdiff
Curl_speedcheck: don't mistakenly clear Curl_expire()
authorAdriano Meirelles <adriano@hardware.com.br>
Thu, 8 Sep 2011 06:38:59 +0000 (08:38 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Thu, 8 Sep 2011 06:39:53 +0000 (08:39 +0200)
The current version of speedcheck.c may disable timeout by setting zero
to Curl_expire. Which is fine using the curl_multi_perform, because it
recheck all timeout internals, but when using custom event poller (like
hiperfifo.c) it may keep stalle connection forever.

lib/speedcheck.c

index 13d5d233e1e08b1d28698941955fe09da0dcd10b..ca2323f57fb146569a7c9120e75ab55869265b2a 100644 (file)
@@ -41,12 +41,12 @@ CURLcode Curl_speedcheck(struct SessionHandle *data,
      (Curl_tvlong(data->state.keeps_speed) != 0) &&
      (data->progress.current_speed < data->set.low_speed_limit)) {
     long howlong = Curl_tvdiff(now, data->state.keeps_speed);
+    long nextcheck = (data->set.low_speed_time * 1000) - howlong;
 
     /* We are now below the "low speed limit". If we are below it
        for "low speed time" seconds we consider that enough reason
        to abort the download. */
-
-    if((howlong/1000) > data->set.low_speed_time) {
+    if(nextcheck <= 0) {
       /* we have been this slow for long enough, now die */
       failf(data,
             "Operation too slow. "
@@ -55,7 +55,10 @@ CURLcode Curl_speedcheck(struct SessionHandle *data,
             data->set.low_speed_time);
       return CURLE_OPERATION_TIMEDOUT;
     }
-    Curl_expire(data, howlong);
+    else {
+      /* wait complete low_speed_time */
+      Curl_expire(data, nextcheck);
+    }
   }
   else {
     /* we keep up the required speed all right */