]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Don't extend introduction circuits indefinitely.
authorNick Mathewson <nickm@torproject.org>
Tue, 10 Feb 2009 00:45:30 +0000 (00:45 +0000)
committerNick Mathewson <nickm@torproject.org>
Tue, 10 Feb 2009 00:45:30 +0000 (00:45 +0000)
Doing so could run you out of relay_early cells and give you a
senselessly long circuit.  Patch from Karsten; may fix bug 878.

svn:r18459

ChangeLog
src/or/rendclient.c

index 1c0b8ee52d4f528a6907ea13bcfe9416ba01da32..0b493a261a21565b7d5f1dbabe8040d005f44ccc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,8 @@ Changes in version 0.2.1.13-????? - 2009-0?-??
       stop preferring the exit and try again.  This situation may not be
       possible now, but will probably become feasible with proposal 158.
       Spotted by rovv.  Fixes another case of bug 752.
+    - Don't re-extend introduction circuits if we ran out of RELAY_EARLY
+      cells. Bugfix on 0.2.1.3-alpha. Fixes more of bug 878.
 
   o Minor features:
     - On Linux, use the prctl call to re-enable core dumps when the user
@@ -160,7 +162,7 @@ Changes in version 0.2.1.10-alpha - 2009-01-06
       guessing the wrong parts of our address as our address.
     - Do not cannibalize a circuit if we're out of RELAY_EARLY cells to
       send on that circuit. Otherwise we might violate the proposal-110
-      limit. Bugfix on 0.2.1.3-alpha. Partial fix for Bug 878. Diagnosis
+      limit. Bugfix on 0.2.1.3-alpha. Partial fix for bug 878. Diagnosis
       thanks to Karsten.
     - When we're sending non-EXTEND cells to the first hop in a circuit,
       for example to use an encrypted directory connection, we don't need
index 3568d50d8691cb70dee82119519bad0e5b332e6f..c68a297c024c5aed11048e313624df1d1aa75c47 100644 (file)
@@ -274,13 +274,31 @@ rend_client_introduction_acked(origin_circuit_t *circ,
         circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
         return -1;
       }
-      log_info(LD_REND,
-               "Got nack for %s from %s. Re-extending circ %d, "
-               "this time to %s.",
-               escaped_safe_str(circ->rend_data->onion_address),
-               circ->build_state->chosen_exit->nickname, circ->_base.n_circ_id,
-               extend_info->nickname);
-      result = circuit_extend_to_new_exit(circ, extend_info);
+      if (circ->remaining_relay_early_cells) {
+        log_info(LD_REND,
+                 "Got nack for %s from %s. Re-extending circ %d, "
+                 "this time to %s.",
+                 escaped_safe_str(circ->rend_data->onion_address),
+                 circ->build_state->chosen_exit->nickname,
+                 circ->_base.n_circ_id, extend_info->nickname);
+        result = circuit_extend_to_new_exit(circ, extend_info);
+      } else {
+        log_info(LD_REND,
+                 "Got nack for %s from %s. Building a new introduction "
+                 "circuit, this time to %s.",
+                 escaped_safe_str(circ->rend_data->onion_address),
+                 circ->build_state->chosen_exit->nickname,
+                 extend_info->nickname);
+        circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED);
+        if (!circuit_launch_by_extend_info(CIRCUIT_PURPOSE_C_INTRODUCING,
+                                           extend_info,
+                                           CIRCLAUNCH_IS_INTERNAL)) {
+          log_warn(LD_REND, "Building introduction circuit failed.");
+          result = -1;
+        } else {
+          result = 0;
+        }
+      }
       extend_info_free(extend_info);
       return result;
     }