Be more robust to bad circwindow values

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.

Also, change the interface for networkstatus_get_param() so we
don't have to lookup the consensus beforehand.
This commit is contained in:
Roger Dingledine 2009-09-22 22:09:33 -04:00
parent 6acfa31d59
commit 0d13e0ed14
3 changed files with 17 additions and 7 deletions

View File

@ -1,4 +1,9 @@
Changes in version 0.2.2.3-alpha - 2009-??-??
Changes in version 0.2.2.3-alpha - 2009-09-23
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.
Changes in version 0.2.2.2-alpha - 2009-09-21
o Major features:

View File

@ -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

View File

@ -1894,14 +1894,18 @@ networkstatus_dump_bridge_status_to_file(time_t now)
}
/** Return the value of a integer parameter from the networkstatus <b>ns</b>
* whose name is <b>param_name</b>. Return <b>default_val</b> if ns is NULL,
* or if it has no parameter called <b>param_name</b>. */
* whose name is <b>param_name</b>. If <b>ns</b> is NULL, try loading the
* latest consensus ourselves. Return <b>default_val</b> if no latest
* consensus, or if it has no parameter called <b>param_name</b>. */
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;