diff --git a/ChangeLog b/ChangeLog
index 74c6ded8b5..3ad104b1d3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+Changes in version 0.2.2.3-alpha - 2009-09-23
+ o Major bugfixes:
+ - Fix an overzealous assert in our new circuit build timeout code.
+ Bugfix on 0.2.2.2-alpha; fixes bug 1103.
+
+ o Minor bugfixes:
+ - If the networkstatus consensus tells us that we should use a
+ negative circuit package window, ignore it. Otherwise we'll
+ believe it and then trigger an assert. Bugfix on 0.2.2.2-alpha.
+
+
Changes in version 0.2.2.2-alpha - 2009-09-21
o Major features:
- Tor now tracks how long it takes to build client-side circuits
diff --git a/configure.in b/configure.in
index 1edb672ab3..e2ae2a1537 100644
--- a/configure.in
+++ b/configure.in
@@ -4,7 +4,7 @@ dnl Copyright (c) 2007-2008, The Tor Project, Inc.
dnl See LICENSE for licensing information
AC_INIT
-AM_INIT_AUTOMAKE(tor, 0.2.2.2-alpha)
+AM_INIT_AUTOMAKE(tor, 0.2.2.3-alpha)
AM_CONFIG_HEADER(orconfig.h)
AC_CANONICAL_HOST
diff --git a/contrib/tor-mingw.nsi.in b/contrib/tor-mingw.nsi.in
index 120d23392d..5fe14e8658 100644
--- a/contrib/tor-mingw.nsi.in
+++ b/contrib/tor-mingw.nsi.in
@@ -9,7 +9,7 @@
!include "FileFunc.nsh"
!insertmacro GetParameters
-!define VERSION "0.2.2.2-alpha"
+!define VERSION "0.2.2.3-alpha"
!define INSTALLER "tor-${VERSION}-win32.exe"
!define WEBSITE "https://www.torproject.org/"
!define LICENSE "LICENSE"
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index b1de024168..adf53a8b10 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -643,6 +643,8 @@ circuit_build_times_count_pretimeouts(circuit_build_times_t *cbt)
double timeout_quantile = 1.0-
((double)cbt->pre_timeouts)/
(cbt->pre_timeouts+cbt->total_build_times);
+ /* Make sure it doesn't exceed the synthetic max */
+ timeout_quantile *= MAX_SYNTHETIC_QUANTILE;
cbt->Xm = circuit_build_times_mode(cbt);
tor_assert(cbt->Xm > 0);
/* Use current timeout to get an estimate on alpha */
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index 259666732a..560bec55f1 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -367,10 +367,11 @@ circuit_purpose_to_controller_string(uint8_t purpose)
int32_t
circuit_initial_package_window(void)
{
- networkstatus_t *consensus = networkstatus_get_latest_consensus();
- if (consensus)
- return networkstatus_get_param(consensus, "circwindow", CIRCWINDOW_START);
- return CIRCWINDOW_START;
+ int32_t num = networkstatus_get_param(NULL, "circwindow", CIRCWINDOW_START);
+ /* If the consensus tells us a negative number, we'd assert. */
+ if (num < 0)
+ num = CIRCWINDOW_START;
+ return num;
}
/** Initialize the common elements in a circuit_t, and add it to the global
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c
index fd38df4e68..5d1f8b24a3 100644
--- a/src/or/networkstatus.c
+++ b/src/or/networkstatus.c
@@ -1894,14 +1894,18 @@ networkstatus_dump_bridge_status_to_file(time_t now)
}
/** Return the value of a integer parameter from the networkstatus ns
- * whose name is param_name. Return default_val if ns is NULL,
- * or if it has no parameter called param_name. */
+ * whose name is param_name. If ns is NULL, try loading the
+ * latest consensus ourselves. Return default_val if no latest
+ * consensus, or if it has no parameter called param_name. */
int32_t
networkstatus_get_param(networkstatus_t *ns, const char *param_name,
int32_t default_val)
{
size_t name_len;
+ if (!ns) /* if they pass in null, go find it ourselves */
+ ns = networkstatus_get_latest_consensus();
+
if (!ns || !ns->net_params)
return default_val;
diff --git a/src/win32/orconfig.h b/src/win32/orconfig.h
index c2ccfa7be8..ef62990712 100644
--- a/src/win32/orconfig.h
+++ b/src/win32/orconfig.h
@@ -226,5 +226,5 @@
#define USING_TWOS_COMPLEMENT
/* Version number of package */
-#define VERSION "0.2.2.2-alpha"
+#define VERSION "0.2.2.3-alpha"