]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Accept small hops backward in the monotonic timer.
authorNick Mathewson <nickm@torproject.org>
Thu, 12 Apr 2018 17:11:35 +0000 (13:11 -0400)
committerNick Mathewson <nickm@torproject.org>
Fri, 13 Apr 2018 14:41:15 +0000 (10:41 -0400)
src/common/token_bucket.c
src/test/test_bwmgt.c

index abb0501833075b2aa193a60bcf504b887fab58a4..6af2982147c8e4d44f486315e187dd5ae2cfd2f9 100644 (file)
@@ -120,6 +120,14 @@ token_bucket_refill(token_bucket_t *bucket,
                     uint32_t now_ts)
 {
   const uint32_t elapsed_ticks = (now_ts - bucket->last_refilled_at_ts);
+  if (elapsed_ticks > UINT32_MAX-(300*1000)) {
+    /* Either about 48 days have passed since the last refill, or the
+     * monotonic clock has somehow moved backwards. (We're looking at you,
+     * Windows.).  We accept up to a 5 minute jump backwards as
+     * "unremarkable".
+     */
+    return 0;
+  }
   const uint32_t elapsed_steps = elapsed_ticks / TICKS_PER_STEP;
 
   if (!elapsed_steps) {
index 7bcfcf7fe954466d4af43835f051022297e26548..2428b15058bc9bda0d320f317f7f908e48c1bbe3 100644 (file)
@@ -178,8 +178,13 @@ test_bwmgt_token_buf_refill(void *arg)
   tt_int_op(b.read_bucket, OP_GT, 8*KB-200);
   tt_int_op(b.read_bucket, OP_LT, 8*KB+200);
 
-  // a ridiculous amount of time passes
+  // We step a second backwards, and nothing happens.
   tt_int_op(0, OP_EQ, token_bucket_refill(&b, START_TS + SEC*64));
+  tt_int_op(b.read_bucket, OP_GT, 8*KB-200);
+  tt_int_op(b.read_bucket, OP_LT, 8*KB+200);
+
+  // A ridiculous amount of time passes.
+  tt_int_op(0, OP_EQ, token_bucket_refill(&b, INT32_MAX));
   tt_int_op(b.read_bucket, OP_EQ, b.burst);
 
  done: