Browse Source

Bug 24946: Fix a warning message caused by a missed purpose check.

Also fix three other checks (found by inspection of all
CIRCUIT_PURPOSE_C_GENERAL occurrences).
Mike Perry 6 years ago
parent
commit
db5b670d85
5 changed files with 21 additions and 2 deletions
  1. 5 0
      changes/bug24946
  2. 2 0
      src/or/circuituse.c
  3. 3 0
      src/or/connection_edge.c
  4. 5 1
      src/or/hs_circuit.c
  5. 6 1
      src/or/rendservice.c

+ 5 - 0
changes/bug24946

@@ -0,0 +1,5 @@
+  o Minor bugfixes (hidden services):
+    - Fix a warning caused by differentiating hsdir circuits from general
+      circuits. Also address three similar checks in the codebase that
+      were related to reuse and rate limiting of circuits. Fixes bug 24946;
+      bugfix on 0.3.3.0-alpha-dev; not in any released version of tor.

+ 2 - 0
src/or/circuituse.c

@@ -134,6 +134,8 @@ circuit_is_acceptable(const origin_circuit_t *origin_circ,
   }
 
   if (purpose == CIRCUIT_PURPOSE_C_GENERAL ||
+      purpose == CIRCUIT_PURPOSE_C_HSDIR_GET ||
+      purpose == CIRCUIT_PURPOSE_S_HSDIR_POST ||
       purpose == CIRCUIT_PURPOSE_HS_VANGUARDS ||
       purpose == CIRCUIT_PURPOSE_C_REND_JOINED) {
     if (circ->timestamp_dirty &&

+ 3 - 0
src/or/connection_edge.c

@@ -792,7 +792,10 @@ connection_ap_expire_beginning(void)
       }
       continue;
     }
+
     if (circ->purpose != CIRCUIT_PURPOSE_C_GENERAL &&
+        circ->purpose != CIRCUIT_PURPOSE_C_HSDIR_GET &&
+        circ->purpose != CIRCUIT_PURPOSE_S_HSDIR_POST &&
         circ->purpose != CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT &&
         circ->purpose != CIRCUIT_PURPOSE_PATH_BIAS_TESTING) {
       log_warn(LD_BUG, "circuit->purpose == CIRCUIT_PURPOSE_C_GENERAL failed. "

+ 5 - 1
src/or/hs_circuit.c

@@ -824,7 +824,11 @@ hs_circ_service_intro_has_opened(hs_service_t *service,
     /* Cleaning up the hidden service identifier and repurpose. */
     hs_ident_circuit_free(circ->hs_ident);
     circ->hs_ident = NULL;
-    circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_GENERAL);
+    if (circuit_should_use_vanguards(TO_CIRCUIT(circ)->purpose))
+      circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_HS_VANGUARDS);
+    else
+      circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_C_GENERAL);
+
     /* Inform that this circuit just opened for this new purpose. */
     circuit_has_opened(circ);
     /* This return value indicate to the caller that the IP object should be

+ 6 - 1
src/or/rendservice.c

@@ -3222,7 +3222,12 @@ rend_service_intro_has_opened(origin_circuit_t *circuit)
                "circuit, but we already have enough. Redefining purpose to "
                "general; leaving as internal.");
 
-      circuit_change_purpose(TO_CIRCUIT(circuit), CIRCUIT_PURPOSE_C_GENERAL);
+      if (circuit_should_use_vanguards(TO_CIRCUIT(circuit)->purpose)) {
+        circuit_change_purpose(TO_CIRCUIT(circuit),
+                CIRCUIT_PURPOSE_HS_VANGUARDS);
+      } else {
+        circuit_change_purpose(TO_CIRCUIT(circuit), CIRCUIT_PURPOSE_C_GENERAL);
+      }
 
       {
         rend_data_free(circuit->rend_data);