summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-11-06 19:58:06 +0000
committerNick Mathewson <nickm@torproject.org>2007-11-06 19:58:06 +0000
commitfad1656a7ff2a40eb35a816661581f1a3f23b128 (patch)
tree7d27bc3e7c2bcf1f8b19c16e9d65e9d441f9faf5
parent897f64c95d18c5eb988ae2cc98fa24049fea49a7 (diff)
downloadtor-fad1656a7ff2a40eb35a816661581f1a3f23b128.tar.gz
tor-fad1656a7ff2a40eb35a816661581f1a3f23b128.zip
r16467@catbus: nickm | 2007-11-06 14:57:00 -0500
Backport r12400 and r12401: Do not allow buckets to overflow. svn:r12402
-rw-r--r--ChangeLog2
-rw-r--r--src/or/connection.c12
2 files changed, 11 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 2161fb9ecb..b19f5ee543 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -30,6 +30,8 @@ Changes in version 0.1.2.18 - 2007-10-28
that it shouldn't be considered to exist at all anymore. Now we
clear all the flags for routers that fall out of the networkstatus
consensus. Fixes bug 529.
+ - When the clock jumps forward a lot, do not allow the bandwidth
+ buckets to become negative. Fixes Bug 544.
o Minor bugfixes:
- Don't try to access (or alter) the state file when running
diff --git a/src/or/connection.c b/src/or/connection.c
index e7c2365595..04fe25dce2 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -1328,15 +1328,19 @@ connection_bucket_refill(int seconds_elapsed)
/* refill the global buckets */
if (global_read_bucket < (int)options->BandwidthBurst) {
+ int initial_read_bucket = global_read_bucket;
global_read_bucket += (int)options->BandwidthRate*seconds_elapsed;
- if (global_read_bucket > (int)options->BandwidthBurst)
+ if (global_read_bucket > (int)options->BandwidthBurst ||
+ global_read_bucket < initial_read_bucket)
global_read_bucket = (int)options->BandwidthBurst;
log(LOG_DEBUG, LD_NET,"global_read_bucket now %d.", global_read_bucket);
}
if (global_write_bucket < (int)options->BandwidthBurst) {
+ int initial_write_bucket = global_write_bucket;
global_write_bucket_empty_last_second = global_write_bucket == 0;
global_write_bucket += (int)options->BandwidthRate*seconds_elapsed;
- if (global_write_bucket > (int)options->BandwidthBurst)
+ if (global_write_bucket > (int)options->BandwidthBurst ||
+ global_write_bucket < initial_write_bucket)
global_write_bucket = (int)options->BandwidthBurst;
log(LOG_DEBUG, LD_NET,"global_write_bucket now %d.", global_write_bucket);
}
@@ -1349,8 +1353,10 @@ connection_bucket_refill(int seconds_elapsed)
if (connection_speaks_cells(conn)) {
or_connection_t *or_conn = TO_OR_CONN(conn);
if (connection_read_bucket_should_increase(or_conn)) {
+ int initial_read_bucket = or_conn->read_bucket;
or_conn->read_bucket += or_conn->bandwidthrate*seconds_elapsed;
- if (or_conn->read_bucket > or_conn->bandwidthburst)
+ if (or_conn->read_bucket > or_conn->bandwidthburst ||
+ or_conn->read_bucket < initial_read_bucket)
or_conn->read_bucket = or_conn->bandwidthburst;
//log_fn(LOG_DEBUG,"Receiver bucket %d now %d.", i,
// conn->read_bucket);