Преглед изворни кода

Merge remote-tracking branch 'teor/bug20613' into maint-0.2.9

Nick Mathewson пре 7 година
родитељ
комит
e8e7a8f3db
2 измењених фајлова са 23 додато и 1 уклоњено
  1. 6 0
      changes/bug20613
  2. 17 1
      src/or/circuituse.c

+ 6 - 0
changes/bug20613

@@ -0,0 +1,6 @@
+  o Minor bugfixes (single onion services, Tor2web):
+    - Stop logging long-term one-hop circuits deliberately created by single
+      onion services and Tor2web. These log messages are intended to diagnose
+      issue 8387, which relates to circuits hanging around forever for no
+      reason.
+      Fixes bug 20613; bugfix on 0.2.9.1-alpha. Reported by "pastly".

+ 17 - 1
src/or/circuituse.c

@@ -788,6 +788,8 @@ static time_t last_expired_clientside_circuits = 0;
  * As a diagnostic for bug 8387, log information about how many one-hop
  * circuits we have around that have been there for at least <b>age</b>
  * seconds. Log a few of them.
+ * Ignores Single Onion Service intro and Tor2web redezvous circuits, they are
+ * expected to be long-term one-hop circuits.
  */
 void
 circuit_log_ancient_one_hop_circuits(int age)
@@ -797,6 +799,7 @@ circuit_log_ancient_one_hop_circuits(int age)
   time_t cutoff = now - age;
   int n_found = 0;
   smartlist_t *log_these = smartlist_new();
+  const or_options_t *options = get_options();
 
   SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) {
     const origin_circuit_t *ocirc;
@@ -804,6 +807,19 @@ circuit_log_ancient_one_hop_circuits(int age)
       continue;
     if (circ->timestamp_created.tv_sec >= cutoff)
       continue;
+    /* Single Onion Services deliberately make long term one-hop intro
+     * connections. We only ignore active intro point connections, if we take
+     * a long time establishing, that's worth logging. */
+    if (rend_service_allow_non_anonymous_connection(options) &&
+        circ->purpose == CIRCUIT_PURPOSE_S_INTRO)
+      continue;
+    /* Tor2web deliberately makes long term one-hop rend connections,
+     * particularly when Tor2webRendezvousPoints is used. We only ignore
+     * active rend point connections, if we take a long time to rendezvous,
+     * that's worth logging. */
+    if (rend_client_allow_non_anonymous_connection(options) &&
+        circ->purpose == CIRCUIT_PURPOSE_C_REND_JOINED)
+      continue;
     ocirc = CONST_TO_ORIGIN_CIRCUIT(circ);
 
     if (ocirc->build_state && ocirc->build_state->onehop_tunnel) {
@@ -839,7 +855,7 @@ circuit_log_ancient_one_hop_circuits(int age)
 
       tor_asprintf(&dirty, "Dirty since %s (%ld seconds vs %ld-second cutoff)",
                    dirty_since, (long)(now - circ->timestamp_dirty),
-                   (long) get_options()->MaxCircuitDirtiness);
+                   (long) options->MaxCircuitDirtiness);
     } else {
       dirty = tor_strdup("Not marked dirty");
     }