]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
prop224: Register RP circuit when it opens
authorDavid Goulet <dgoulet@torproject.org>
Thu, 24 Aug 2017 12:49:24 +0000 (08:49 -0400)
committerDavid Goulet <dgoulet@torproject.org>
Thu, 24 Aug 2017 17:03:29 +0000 (13:03 -0400)
Only register the RP circuit when it opens and not when we send the INTRODUCE1
cell else, when re-extending to a new IP, we would register the same RP
circuit with the same cookie twice leading to the circuit being closed.

Signed-off-by: David Goulet <dgoulet@torproject.org>
src/or/hs_circuit.c
src/or/hs_circuitmap.c
src/or/hs_client.c
src/test/test_circuitlist.c

index 7d41a33c89cf0f1f116ec99c6b26322a582acd10..2bfeac747c5ba604decc991a187938001b80813c 100644 (file)
@@ -1070,10 +1070,6 @@ hs_circ_send_introduce1(origin_circuit_t *intro_circ,
     goto done;
   }
 
-  /* Register rend circuit in circuitmap */
-  hs_circuitmap_register_rend_circ_client_side(rend_circ,
-                              rend_circ->hs_ident->rendezvous_cookie);
-
   /* Success. */
   ret = 0;
   goto done;
index f235ecc82d29a933978a215f676aee014417d80b..09704d796c985eadeb7874e014d4fd7d34330e83 100644 (file)
@@ -408,7 +408,8 @@ hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie)
 
 /* Public function: Return client-side rendezvous circuit with rendezvous
  * <b>cookie</b>. It will first lookup for the CIRCUIT_PURPOSE_C_REND_READY
- * purpose and then try for CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED.
+ * purpose and then try for CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED and then
+ * finally tries for CIRCUIT_PURPOSE_C_ESTABLISH_REND.
  *
  * Return NULL if no such circuit is found in the circuitmap. */
 origin_circuit_t *
@@ -426,6 +427,13 @@ hs_circuitmap_get_rend_circ_client_side(const uint8_t *cookie)
   circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_CLIENT_SIDE,
                                           REND_TOKEN_LEN, cookie,
                                  CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED);
+  if (circ) {
+    return circ;
+  }
+
+  circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_CLIENT_SIDE,
+                                          REND_TOKEN_LEN, cookie,
+                                          CIRCUIT_PURPOSE_C_ESTABLISH_REND);
   return circ;
 }
 
@@ -472,8 +480,7 @@ hs_circuitmap_register_rend_circ_client_side(origin_circuit_t *or_circ,
 {
   circuit_t *circ = TO_CIRCUIT(or_circ);
   { /* Basic circ purpose sanity checking */
-    tor_assert_nonfatal(circ->purpose == CIRCUIT_PURPOSE_C_REND_READY ||
-                    circ->purpose == CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED);
+    tor_assert_nonfatal(circ->purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND);
   }
 
   hs_circuitmap_register_circuit(circ, HS_TOKEN_REND_CLIENT_SIDE,
index 57bd870798e5a296ec7d90ac86a9b04446a5c692..3e25126a6a0b8b8bba18be7a9906f13ed031dcad 100644 (file)
@@ -434,6 +434,12 @@ client_rendezvous_circ_has_opened(origin_circuit_t *circ)
   /* Ignore returned value, nothing we can really do. On failure, the circuit
    * will be marked for close. */
   hs_circ_send_establish_rendezvous(circ);
+
+  /* Register rend circuit in circuitmap if it's still alive. */
+  if (!TO_CIRCUIT(circ)->marked_for_close) {
+    hs_circuitmap_register_rend_circ_client_side(circ,
+                                     circ->hs_ident->rendezvous_cookie);
+  }
 }
 
 /* This is an helper function that convert a descriptor intro point object ip
index 6b8dae31f41a7bab2decda9ca6d5abbd70063846..f622704ec5a6e69088ede1d825b05146b5545983 100644 (file)
@@ -267,7 +267,7 @@ test_rend_token_maps(void *arg)
   tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3));
 
   /* Now let's do a check for the client-side rend circuitmap */
-  c5->base_.purpose = CIRCUIT_PURPOSE_C_REND_READY;
+  c5->base_.purpose = CIRCUIT_PURPOSE_C_ESTABLISH_REND;
   hs_circuitmap_register_rend_circ_client_side(c5, tok1);
 
   tt_ptr_op(c5, OP_EQ, hs_circuitmap_get_rend_circ_client_side(tok1));