]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
prop224: Recompute all HSDir indices when we enter overlap mode.
authorGeorge Kadianakis <desnacked@riseup.net>
Sat, 19 Aug 2017 13:00:58 +0000 (16:00 +0300)
committerGeorge Kadianakis <desnacked@riseup.net>
Sat, 19 Aug 2017 13:29:23 +0000 (16:29 +0300)
When we enter overlap mode we start using the next hsdir index of
relays. However, we only compute the next hsdir index of relays when we
receive a consensus or their descriptor. This means that there is a
window of time between entering the overlap period and fetching the
consensus where relays have their next hsdir index uninitialized. This
patch fixes this by recomputing all hsdir indices when we first enter
the overlap period.

src/or/hs_service.c
src/or/nodelist.c
src/or/nodelist.h

index e213efe06a3987c62647e6786d904e4dc52ea49d..31776c8b5e6f96282b06fbaf445eece0e3b84514 100644 (file)
@@ -1739,6 +1739,13 @@ rotate_all_descriptors(time_t now)
      * it in order to make sure we don't rotate at next check. */
     service->state.in_overlap_period = 1;
 
+    /* We just entered overlap period: recompute all HSDir indices. We need to
+     * do this otherwise nodes can get stuck with old HSDir indices until we
+     * fetch a new consensus, and we might need to reupload our desc before
+     * that. */
+    /* XXX find a better place than rotate_all_descriptors() to do this */
+    nodelist_recompute_all_hsdir_indices();
+
     /* If we have a next descriptor lined up, rotate the descriptors so that it
      * becomes current. */
     if (service->desc_next) {
index d75b386e01396c8fcc6f9709df0dd85a9103bf50..6acc87f967e8b5600e0c9f1e846dce78a23ed3fe 100644 (file)
@@ -238,6 +238,27 @@ node_set_hsdir_index(node_t *node, const networkstatus_t *ns)
   return;
 }
 
+/** Recompute all node hsdir indices. */
+void
+nodelist_recompute_all_hsdir_indices(void)
+{
+  networkstatus_t *consensus;
+  if (!the_nodelist) {
+    return;
+  }
+
+  /* Get a live consensus. Abort if not found */
+  consensus = networkstatus_get_live_consensus(approx_time());
+  if (!consensus) {
+    return;
+  }
+
+  /* Recompute all hsdir indices */
+  SMARTLIST_FOREACH_BEGIN(the_nodelist->nodes, node_t *, node) {
+    node_set_hsdir_index(node, consensus);
+  } SMARTLIST_FOREACH_END(node);
+}
+
 /** Called when a node's address changes. */
 static void
 node_addrs_changed(node_t *node)
index 06a08a288c0619b5874749c4409a94632c2327a6..d16cf0ecf71d1245fd2b72779848ef913f4bf42d 100644 (file)
@@ -28,6 +28,8 @@ void nodelist_remove_routerinfo(routerinfo_t *ri);
 void nodelist_purge(void);
 smartlist_t *nodelist_find_nodes_with_microdesc(const microdesc_t *md);
 
+void nodelist_recompute_all_hsdir_indices(void);
+
 void nodelist_free_all(void);
 void nodelist_assert_ok(void);