[tor-commits] [tor/master] Fix integer overflow in the rate-limiter (#19435).

nickm at torproject.org nickm at torproject.org
Tue Jul 26 14:00:39 UTC 2016


commit 77459b97aac15949c5160ca8abb9af792f02ac73
Author: Ivan Markin <twim at riseup.net>
Date:   Fri Jun 17 03:44:58 2016 +0000

    Fix integer overflow in the rate-limiter (#19435).
---
 changes/bug19435  |  6 ++++++
 src/common/util.c | 14 ++++++++++++--
 src/common/util.h |  1 +
 3 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/changes/bug19435 b/changes/bug19435
new file mode 100644
index 0000000..ccd916b
--- /dev/null
+++ b/changes/bug19435
@@ -0,0 +1,6 @@
+  o Major bugfixes (user interface):
+    - Fix an integer overflow in the rate-limiter that caused displaying of
+      wrong number of suppressed messages (if there are too many of them).
+      If the number of messages hits the limit of messages per interval the
+      rate-limiter drops a warning and doesn't count any further.
+      Fixes bug 19435.
diff --git a/src/common/util.c b/src/common/util.c
index 538aeb1..72efd89 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -1983,7 +1983,9 @@ update_approx_time(time_t now)
 
 /** If the rate-limiter <b>lim</b> is ready at <b>now</b>, return the number
  * of calls to rate_limit_is_ready (including this one!) since the last time
- * rate_limit_is_ready returned nonzero.  Otherwise return 0. */
+ * rate_limit_is_ready returned nonzero.  Otherwise return 0.
+ * If the call number hits <b>RATELIM_TOOMANY</b> limit, drop a warning
+ * about this event and stop counting. */
 static int
 rate_limit_is_ready(ratelim_t *lim, time_t now)
 {
@@ -1993,7 +1995,15 @@ rate_limit_is_ready(ratelim_t *lim, time_t now)
     lim->n_calls_since_last_time = 0;
     return res;
   } else {
-    ++lim->n_calls_since_last_time;
+    if (lim->n_calls_since_last_time < RATELIM_TOOMANY) {
+      ++lim->n_calls_since_last_time;
+    } else if (lim->n_calls_since_last_time == RATELIM_TOOMANY) {
+      log_warn(LD_GENERAL,
+        "Enormously large number of messages (%d). It's probably a bug.",
+        RATELIM_TOOMANY);
+      ++lim->n_calls_since_last_time;
+    }
+
     return 0;
   }
 }
diff --git a/src/common/util.h b/src/common/util.h
index 0d48eac..837d2e9 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -292,6 +292,7 @@ typedef struct ratelim_t {
 } ratelim_t;
 
 #define RATELIM_INIT(r) { (r), 0, 0 }
+#define RATELIM_TOOMANY (16*1000)
 
 char *rate_limit_log(ratelim_t *lim, time_t now);
 





More information about the tor-commits mailing list