[tor-commits] [tor/master] Prevent hugely inflated observed bandwidth values

nickm at torproject.org nickm at torproject.org
Tue Apr 19 19:41:02 UTC 2011


commit 3f7f96d9e7aa2254d62d63530c37ee96d4b3abc8
Author: Sebastian Hahn <sebastian at torproject.org>
Date:   Tue Apr 19 16:00:41 2011 +0200

    Prevent hugely inflated observed bandwidth values
    
    When reading the bw history from the state file, we'd add the 900-second
    value as traffic that occured during one second. Fix that by adding the
    average value to each second.
    
    This bug was present since 0.2.0.5-alpha, but was hidden until
    0.2.23-alpha when we started using the saved values.
---
 changes/bug2704_part2 |    5 +++++
 src/or/rephist.c      |   19 ++++++++++++++++---
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/changes/bug2704_part2 b/changes/bug2704_part2
new file mode 100644
index 0000000..962c8b7
--- /dev/null
+++ b/changes/bug2704_part2
@@ -0,0 +1,5 @@
+  o Major bugfixes:
+    - Prevent relays that read their bandwidth history from their state file
+      from arbitrarily inflating that value. Fixes the second half of bug
+      2704, bugfix on tor-0.2.2.23-alpha.
+
diff --git a/src/or/rephist.c b/src/or/rephist.c
index 6034bbc..fb091d5 100644
--- a/src/or/rephist.c
+++ b/src/or/rephist.c
@@ -1686,11 +1686,24 @@ rep_hist_load_bwhist_state_section(bw_array_t *b,
         }
 
         if (start < now) {
-          add_obs(b, start, v);
+          time_t cur_start = start;
+          time_t actual_interval_len = s_interval;
+          uint64_t cur_val = 0;
+          /* Calculate the average per second. This is the best we can do
+           * because our state file doesn't have per-second resolution. */
+          if (start + s_interval > now)
+            actual_interval_len = now - start;
+          cur_val = v / actual_interval_len;
+          /* This is potentially inefficient, but since we don't do it very
+           * often it should be ok. */
+          while (cur_start < start + actual_interval_len) {
+            add_obs(b, cur_start, cur_val);
+            ++cur_start;
+          }
           b->max_total = mv;
           /* This will result in some fairly choppy history if s_interval
-           * is notthe same as NUM_SECS_BW_SUM_INTERVAL. XXXX */
-          start += s_interval;
+           * is not the same as NUM_SECS_BW_SUM_INTERVAL. XXXX */
+          start += actual_interval_len;
         }
     } SMARTLIST_FOREACH_END(cp);
   }





More information about the tor-commits mailing list