Browse Source

r11469@Kushana: nickm | 2006-12-07 15:11:04 -0500
Round stored/transmitted values for bandwidth usage. This might make some attacks work less well. This might well be voodoo, but it gives me a warm fuzzy feeling.


svn:r9048

Nick Mathewson 19 years ago
parent
commit
b4a90ca8a3
3 changed files with 14 additions and 8 deletions
  1. 2 0
      ChangeLog
  2. 7 4
      src/or/hibernate.c
  3. 5 4
      src/or/rephist.c

+ 2 - 0
ChangeLog

@@ -23,6 +23,8 @@ Changes in version 0.1.2.5-xxxx - 200?-??-??
     - Clients do not store bandwidth history in their state files. (This
     - Clients do not store bandwidth history in their state files. (This
       shouldn't be an exploitable security issue, but it's better to be
       shouldn't be an exploitable security issue, but it's better to be
       safe.)
       safe.)
+    - When generating bandwidth history, round down to the nearest 1k. When
+      storing accounting data, round up to the nearest 1k.
 
 
   o Controller bugfixes:
   o Controller bugfixes:
     - Report the circuit number correctly in STREAM CLOSED events. (Bug
     - Report the circuit number correctly in STREAM CLOSED events. (Bug

+ 7 - 4
src/or/hibernate.c

@@ -530,6 +530,7 @@ accounting_set_wakeup_time(void)
   }
   }
 }
 }
 
 
+#define ROUND_UP(x) (((x) + 0x3ff) & ~0x3ff)
 #define BW_ACCOUNTING_VERSION 1
 #define BW_ACCOUNTING_VERSION 1
 /** Save all our bandwidth tracking information to disk. Return 0 on
 /** Save all our bandwidth tracking information to disk. Return 0 on
  * success, -1 on failure. */
  * success, -1 on failure. */
@@ -561,8 +562,8 @@ accounting_record_bandwidth_usage(time_t now, or_state_t *state)
                BW_ACCOUNTING_VERSION,
                BW_ACCOUNTING_VERSION,
                time1,
                time1,
                time2,
                time2,
-               U64_PRINTF_ARG(n_bytes_read_in_interval),
-               U64_PRINTF_ARG(n_bytes_written_in_interval),
+               U64_PRINTF_ARG(ROUND_UP(n_bytes_read_in_interval)),
+               U64_PRINTF_ARG(ROUND_UP(n_bytes_written_in_interval)),
                (unsigned long)n_seconds_active_in_interval,
                (unsigned long)n_seconds_active_in_interval,
                (unsigned long)expected_bandwidth_usage);
                (unsigned long)expected_bandwidth_usage);
   tor_snprintf(fname, sizeof(fname), "%s/bw_accounting",
   tor_snprintf(fname, sizeof(fname), "%s/bw_accounting",
@@ -571,14 +572,16 @@ accounting_record_bandwidth_usage(time_t now, or_state_t *state)
 
 
   /* Now update the state */
   /* Now update the state */
   state->AccountingIntervalStart = interval_start_time;
   state->AccountingIntervalStart = interval_start_time;
-  state->AccountingBytesReadInInterval = n_bytes_read_in_interval;
-  state->AccountingBytesWrittenInInterval = n_bytes_written_in_interval;
+  state->AccountingBytesReadInInterval = ROUND_UP(n_bytes_read_in_interval);
+  state->AccountingBytesWrittenInInterval =
+    ROUND_UP(n_bytes_written_in_interval);
   state->AccountingSecondsActive = n_seconds_active_in_interval;
   state->AccountingSecondsActive = n_seconds_active_in_interval;
   state->AccountingExpectedUsage = expected_bandwidth_usage;
   state->AccountingExpectedUsage = expected_bandwidth_usage;
   or_state_mark_dirty(state, 60);
   or_state_mark_dirty(state, 60);
 
 
   return r;
   return r;
 }
 }
+#undef ROUND_UP
 
 
 /** Read stored accounting information from disk. Return 0 on success;
 /** Read stored accounting information from disk. Return 0 on success;
  * return -1 and change nothing on failure. */
  * return -1 and change nothing on failure. */

+ 5 - 4
src/or/rephist.c

@@ -596,13 +596,14 @@ rep_hist_fill_bandwidth_history(char *buf, size_t len, bw_array_t *b)
   }
   }
 
 
   for (n=0; n<b->num_maxes_set; ++n,++i) {
   for (n=0; n<b->num_maxes_set; ++n,++i) {
+    uint64_t total;
     while (i >= NUM_TOTALS) i -= NUM_TOTALS;
     while (i >= NUM_TOTALS) i -= NUM_TOTALS;
+    /* Round the bandwidth used down to the nearest 1k. */
+    total = b->totals[i] & ~0x3ff;
     if (n==(b->num_maxes_set-1))
     if (n==(b->num_maxes_set-1))
-      tor_snprintf(cp, len-(cp-buf), U64_FORMAT,
-                   U64_PRINTF_ARG(b->totals[i]));
+      tor_snprintf(cp, len-(cp-buf), U64_FORMAT, U64_PRINTF_ARG(total));
     else
     else
-      tor_snprintf(cp, len-(cp-buf), U64_FORMAT",",
-                   U64_PRINTF_ARG(b->totals[i]));
+      tor_snprintf(cp, len-(cp-buf), U64_FORMAT",", U64_PRINTF_ARG(total));
     cp += strlen(cp);
     cp += strlen(cp);
   }
   }
   return cp-buf;
   return cp-buf;