Browse Source

r11580@Kushana: nickm | 2006-12-15 00:09:46 -0500
Resolve bug 369: Check for integer underflow when printing "bytes left" accounting numbers. Also fix a copyright date that I noticed while reading the bug. Also make a buffer big enough that strings will not get truncated. All are backport candidates.


svn:r9115

Nick Mathewson 17 years ago
parent
commit
fdb10ff0b5
3 changed files with 12 additions and 5 deletions
  1. 3 0
      ChangeLog
  2. 1 1
      src/or/config.c
  3. 8 4
      src/or/hibernate.c

+ 3 - 0
ChangeLog

@@ -51,6 +51,9 @@ Changes in version 0.1.2.5-xxxx - 200?-??-??
   o Controller bugfixes:
     - Report the circuit number correctly in STREAM CLOSED events. (Bug
       reported by Mike Perry.)
+    - Do not report bizarre values for results of accounting GETINFOs
+      when the last second's write or read exceeds the alloted bandwidth.
+      (Bug 329.)
 
 
 Changes in version 0.1.2.4-alpha - 2006-12-03

+ 1 - 1
src/or/config.c

@@ -1585,7 +1585,7 @@ static void
 print_usage(void)
 {
   printf(
-"Copyright 2001-2005 Roger Dingledine, Nick Mathewson.\n\n"
+"Copyright 2001-2006 Roger Dingledine, Nick Mathewson.\n\n"
 "tor -f <torrc> [args]\n"
 "See man page for options, or http://tor.eff.org/ for documentation.\n");
 }

+ 8 - 4
src/or/hibernate.c

@@ -949,10 +949,14 @@ getinfo_helper_accounting(control_connection_t *conn,
                  U64_PRINTF_ARG(n_bytes_written_in_interval));
   } else if (!strcmp(question, "accounting/bytes-left")) {
     uint64_t limit = get_options()->AccountingMax;
-    *answer = tor_malloc(32);
-    tor_snprintf(*answer, 32, U64_FORMAT" "U64_FORMAT,
-                 U64_PRINTF_ARG(limit - n_bytes_read_in_interval),
-                 U64_PRINTF_ARG(limit - n_bytes_written_in_interval));
+    uint64_t read_left = 0, write_left = 0;
+    if (n_bytes_read_in_interval < limit)
+      read_left = limit - n_bytes_read_in_interval;
+    if (n_bytes_written_in_interval < limit)
+      write_left = limit - n_bytes_written_in_interval;
+    *answer = tor_malloc(64);
+    tor_snprintf(*answer, 64, U64_FORMAT" "U64_FORMAT,
+                 U64_PRINTF_ARG(read_left), U64_PRINTF_ARG(write_left));
   } else if (!strcmp(question, "accounting/interval-start")) {
     *answer = tor_malloc(ISO_TIME_LEN+1);
     format_iso_time(*answer, interval_start_time);