diff options
author | Daniel Stenberg <daniel@haxx.se> | 2017-04-10 23:53:33 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2017-04-11 16:53:33 +0200 |
commit | ab6d23278e507eb1f8dc1ea6c33191827ae6cc5e (patch) | |
tree | 8748caa74242828ce85724645ab8eb736fde6304 | |
parent | f79913050dfa127a8a62b4d340bb5415b83f3725 (diff) |
Curl_expire_latest: ignore already expired timers
If the existing timer is still in there but has expired, the new timer
should be added.
Reported-by: Rainer Canavan
Bug: https://curl.haxx.se/mail/lib-2017-04/0030.html
Closes #1407
-rw-r--r-- | lib/multi.c | 9 | ||||
-rw-r--r-- | tests/data/test1238 | 2 |
2 files changed, 7 insertions, 4 deletions
diff --git a/lib/multi.c b/lib/multi.c index 46286b77b..b24ce19dd 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -3001,11 +3001,14 @@ void Curl_expire_latest(struct Curl_easy *data, time_t milli) if(expire->tv_sec || expire->tv_usec) { /* This means that the struct is added as a node in the splay tree. Compare if the new time is earlier, and only remove-old/add-new if it - is. */ + is. */ time_t diff = curlx_tvdiff(set, *expire); - if(diff > 0) - /* the new expire time was later than the top time, so just skip this */ + if((diff > 0) && (diff < milli)) { + /* if the new expire time is later than the top time, skip it, but not + if the diff is larger than the new offset since then the previous + time is already expired! */ return; + } } /* Just add the timeout like normal */ diff --git a/tests/data/test1238 b/tests/data/test1238 index 4c976c776..a0eef417d 100644 --- a/tests/data/test1238 +++ b/tests/data/test1238 @@ -10,7 +10,7 @@ TFTP RRQ # Server-side <reply> <servercmd> -writedelay: 1 +writedelay: 2 </servercmd> # ~1200 bytes (so that they don't fit in two 512 byte chunks) <data nocheck="yes"> |