summaryrefslogtreecommitdiff
path: root/src/or/shared_random.c
diff options
context:
space:
mode:
authorGeorge Kadianakis <desnacked@riseup.net>2017-08-04 12:21:14 +0300
committerNick Mathewson <nickm@torproject.org>2017-08-08 20:29:34 -0400
commitb89d2fa1db2379bffd2e2b4c851c3facc57b6ed8 (patch)
tree6f4769adc1ddfd5d4c82958eba03ce5575bd113c /src/or/shared_random.c
parent440eaa9b22573cdb0d38bf5c13200cc1077a453f (diff)
downloadtor-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.c38
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;
}