]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Clear last_hid_serv_requests on SIGNAL NEWNYM
authorRobert Ransom <rransom.8774@gmail.com>
Thu, 2 Jun 2011 09:46:04 +0000 (02:46 -0700)
committerRobert Ransom <rransom.8774@gmail.com>
Thu, 2 Jun 2011 09:52:40 +0000 (02:52 -0700)
Fixes bug #3309.

changes/bug3309 [new file with mode: 0644]
src/or/main.c
src/or/rendclient.c
src/or/rendclient.h

diff --git a/changes/bug3309 b/changes/bug3309
new file mode 100644 (file)
index 0000000..5df0d9d
--- /dev/null
@@ -0,0 +1,9 @@
+  o Minor bugfixes:
+    - Clear the table recording the time of the last request for each
+      hidden service descriptor from each HS directory on SIGNAL
+      NEWNYM.  Previously, we would clear our HS descriptor cache on
+      SIGNAL NEWNYM, but if we had previously retrieved a descriptor
+      (or tried to) from every directory responsible for it, we would
+      refuse to fetch it again for up to 15 minutes.  Bugfix on
+      0.2.2.25-alpha; fixes bug 3309.
+
index adbde9044f843033fedbf357dddb342b4cadb646..3c84ddaa6450a0c1708d01874bc6d28aef5e6a57 100644 (file)
@@ -855,6 +855,7 @@ signewnym_impl(time_t now)
   addressmap_clear_transient();
   rend_cache_purge();
   rend_client_cancel_descriptor_fetches();
+  rend_client_purge_last_hid_serv_requests();
   time_of_last_signewnym = now;
   signewnym_is_pending = 0;
 }
index ec6e3f2bed8d1ad6c04038e33b65b15a3cdd551c..12b54df0d61ba83af3ef71ae740ebbd11b8961af 100644 (file)
@@ -444,6 +444,25 @@ directory_clean_last_hid_serv_requests(void)
   }
 }
 
+/** Purge the history of request times to hidden service directories,
+ * so that future lookups of an HS descriptor will not fail because we
+ * accessed all of the HSDir relays responsible for the descriptor
+ * recently. */
+void
+rend_client_purge_last_hid_serv_requests(void)
+{
+  /* Don't create the table if it doesn't exist yet (and it may very
+   * well not exist if the user hasn't accessed any HSes)... */
+  strmap_t *old_last_hid_serv_requests = last_hid_serv_requests_;
+  /* ... and let get_last_hid_serv_requests re-create it for us if
+   * necessary. */
+  last_hid_serv_requests_ = NULL;
+
+  if (old_last_hid_serv_requests != NULL) {
+    strmap_free(old_last_hid_serv_requests, _tor_free);
+  }
+}
+
 /** Determine the responsible hidden service directories for <b>desc_id</b>
  * and fetch the descriptor belonging to that ID from one of them. Only
  * send a request to hidden service directories that we did not try within
index 6910c1a97be26dfa41e1a85503eb12794380b1a9..2bfc850ad589785c79364dc4dcecc51c4d82611e 100644 (file)
@@ -19,6 +19,7 @@ int rend_client_introduction_acked(origin_circuit_t *circ,
                                    size_t request_len);
 void rend_client_refetch_v2_renddesc(const rend_data_t *rend_query);
 void rend_client_cancel_descriptor_fetches(void);
+void rend_client_purge_last_hid_serv_requests(void);
 int rend_client_remove_intro_point(extend_info_t *failed_intro,
                                    const rend_data_t *rend_query);
 int rend_client_rendezvous_acked(origin_circuit_t *circ,