Commit 587cc311 authored by Nick Mathewson's avatar Nick Mathewson 🤹
Browse files

Merge remote-tracking branch 'origin/maint-0.2.2'

Conflicts:
	src/or/rendclient.c
parents 6a320b99 80038b54
Loading
Loading
Loading
Loading

changes/bug3309

0 → 100644
+13 −0
Original line number Diff line number Diff line
  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.

  o Minor features:
    - Log (at info level) when purging pieces of hidden-service-client
      state on SIGNAL NEWNYM.
+1 −2
Original line number Diff line number Diff line
@@ -1027,8 +1027,7 @@ signewnym_impl(time_t now)

  circuit_expire_all_dirty_circs();
  addressmap_clear_transient();
  rend_cache_purge();
  rend_client_cancel_descriptor_fetches();
  rend_client_purge_state();
  time_of_last_signewnym = now;
  signewnym_is_pending = 0;
}
+43 −3
Original line number Diff line number Diff line
@@ -28,6 +28,16 @@ static extend_info_t *rend_client_get_random_intro_impl(
                          const rend_cache_entry_t *rend_query,
                          const int strict, const int warnings);

/** Purge all potentially remotely-detectable state held in the hidden
 * service client code.  Called on SIGNAL NEWNYM. */
void
rend_client_purge_state(void)
{
  rend_cache_purge();
  rend_client_cancel_descriptor_fetches();
  rend_client_purge_last_hid_serv_requests();
}

/** Called when we've established a circuit to an introduction point:
 * send the introduction request. */
void
@@ -378,7 +388,17 @@ rend_client_introduction_acked(origin_circuit_t *circ,
 * certain queries; keys are strings consisting of base32-encoded
 * hidden service directory identities and base32-encoded descriptor IDs;
 * values are pointers to timestamps of the last requests. */
static strmap_t *last_hid_serv_requests = NULL;
static strmap_t *last_hid_serv_requests_ = NULL;

/** Returns last_hid_serv_requests_, initializing it to a new strmap if
 * necessary. */
static strmap_t *
get_last_hid_serv_requests(void)
{
  if (!last_hid_serv_requests_)
    last_hid_serv_requests_ = strmap_new();
  return last_hid_serv_requests_;
}

/** Look up the last request time to hidden service directory <b>hs_dir</b>
 * for descriptor ID <b>desc_id_base32</b>. If <b>set</b> is non-zero,
@@ -392,6 +412,7 @@ lookup_last_hid_serv_request(routerstatus_t *hs_dir,
  char hsdir_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
  char hsdir_desc_comb_id[2 * REND_DESC_ID_V2_LEN_BASE32 + 1];
  time_t *last_request_ptr;
  strmap_t *last_hid_serv_requests = get_last_hid_serv_requests();
  base32_encode(hsdir_id_base32, sizeof(hsdir_id_base32),
                hs_dir->identity_digest, DIGEST_LEN);
  tor_snprintf(hsdir_desc_comb_id, sizeof(hsdir_desc_comb_id), "%s%s",
@@ -417,8 +438,7 @@ directory_clean_last_hid_serv_requests(time_t now)
{
  strmap_iter_t *iter;
  time_t cutoff = now - REND_HID_SERV_DIR_REQUERY_PERIOD;
  if (!last_hid_serv_requests)
    last_hid_serv_requests = strmap_new();
  strmap_t *last_hid_serv_requests = get_last_hid_serv_requests();
  for (iter = strmap_iter_init(last_hid_serv_requests);
       !strmap_iter_done(iter); ) {
    const char *key;
@@ -435,6 +455,26 @@ directory_clean_last_hid_serv_requests(time_t now)
  }
}

/** 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) {
    log_info(LD_REND, "Purging client last-HS-desc-request-time table");
    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
+3 −0
Original line number Diff line number Diff line
@@ -12,6 +12,8 @@
#ifndef _TOR_RENDCLIENT_H
#define _TOR_RENDCLIENT_H

void rend_client_purge_state(void);

void rend_client_introcirc_has_opened(origin_circuit_t *circ);
void rend_client_rendcirc_has_opened(origin_circuit_t *circ);
int rend_client_introduction_acked(origin_circuit_t *circ,
@@ -19,6 +21,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,
+3 −1
Original line number Diff line number Diff line
@@ -838,8 +838,10 @@ rend_cache_clean(time_t now)
void
rend_cache_purge(void)
{
  if (rend_cache)
  if (rend_cache) {
    log_info(LD_REND, "Purging client/v0-HS-authority HS descriptor cache");
    strmap_free(rend_cache, _rend_cache_entry_free);
  }
  rend_cache = strmap_new();
}