diff options
author | George Kadianakis <desnacked@riseup.net> | 2017-08-04 12:21:14 +0300 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2017-08-08 20:29:34 -0400 |
commit | b89d2fa1db2379bffd2e2b4c851c3facc57b6ed8 (patch) | |
tree | 6f4769adc1ddfd5d4c82958eba03ce5575bd113c /src/or/shared_random.c | |
parent | 440eaa9b22573cdb0d38bf5c13200cc1077a453f (diff) | |
download | tor-b89d2fa1db2379bffd2e2b4c851c3facc57b6ed8.tar.gz tor-b89d2fa1db2379bffd2e2b4c851c3facc57b6ed8.zip |
Don't set HSDir index if we don't have a live consensus.
We also had to alter the SRV functions to take a consensus as optional
input, since we might be setting our HSDir index using a consensus that
is currently being processed and won't be returned by the
networkstatus_get_live_consensus() function.
This change has two results:
a) It makes sure we are using a fresh consensus with the right SRV value
when we are calculating the HSDir hash ring.
b) It ensures that we will not use the sr_get_current/previous()
functions when we don't have a consensus which would have falsely
triggered the disaster SRV logic.
Diffstat (limited to 'src/or/shared_random.c')
-rw-r--r-- | src/or/shared_random.c | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/or/shared_random.c b/src/or/shared_random.c index ec2533dad2..e4ee64139a 100644 --- a/src/or/shared_random.c +++ b/src/or/shared_random.c @@ -1393,11 +1393,22 @@ sr_get_previous_for_control(void) /* Return current shared random value from the latest consensus. Caller can * NOT keep a reference to the returned pointer. Return NULL if none. */ const sr_srv_t * -sr_get_current(void) +sr_get_current(const networkstatus_t *ns) { - const networkstatus_t *c = networkstatus_get_latest_consensus(); - if (c) { - return c->sr_info.current_srv; + const networkstatus_t *consensus; + + /* Use provided ns else get a live one */ + if (ns) { + consensus = ns; + } else { + consensus = networkstatus_get_live_consensus(approx_time()); + } + /* Ideally we would never be asked for an SRV without a live consensus. Make + * sure this assumption is correct. */ + tor_assert_nonfatal(consensus); + + if (consensus) { + return consensus->sr_info.current_srv; } return NULL; } @@ -1405,11 +1416,22 @@ sr_get_current(void) /* Return previous shared random value from the latest consensus. Caller can * NOT keep a reference to the returned pointer. Return NULL if none. */ const sr_srv_t * -sr_get_previous(void) +sr_get_previous(const networkstatus_t *ns) { - const networkstatus_t *c = networkstatus_get_latest_consensus(); - if (c) { - return c->sr_info.previous_srv; + const networkstatus_t *consensus; + + /* Use provided ns else get a live one */ + if (ns) { + consensus = ns; + } else { + consensus = networkstatus_get_live_consensus(approx_time()); + } + /* Ideally we would never be asked for an SRV without a live consensus. Make + * sure this assumption is correct. */ + tor_assert_nonfatal(consensus); + + if (consensus) { + return consensus->sr_info.previous_srv; } return NULL; } |