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 Changes in version 0.2.2.2-alpha - 2009-09-21
o Major features: o Major features:

View File

@ -367,10 +367,11 @@ circuit_purpose_to_controller_string(uint8_t purpose)
int32_t int32_t
circuit_initial_package_window(void) circuit_initial_package_window(void)
{ {
networkstatus_t *consensus = networkstatus_get_latest_consensus(); int32_t num = networkstatus_get_param(NULL, "circwindow", CIRCWINDOW_START);
if (consensus) /* If the consensus tells us a negative number, we'd assert. */
return networkstatus_get_param(consensus, "circwindow", CIRCWINDOW_START); if (num < 0)
return CIRCWINDOW_START; num = CIRCWINDOW_START;
return num;
} }
/** Initialize the common elements in a circuit_t, and add it to the global /** 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> /** 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, * whose name is <b>param_name</b>. If <b>ns</b> is NULL, try loading the
* or if it has no parameter called <b>param_name</b>. */ * 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 int32_t
networkstatus_get_param(networkstatus_t *ns, const char *param_name, networkstatus_get_param(networkstatus_t *ns, const char *param_name,
int32_t default_val) int32_t default_val)
{ {
size_t name_len; 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) if (!ns || !ns->net_params)
return default_val; return default_val;