]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Do not count controller-selected paths towards path bias.
authorNick Mathewson <nickm@torproject.org>
Mon, 15 Nov 2021 13:55:47 +0000 (08:55 -0500)
committerNick Mathewson <nickm@torproject.org>
Mon, 15 Nov 2021 13:55:47 +0000 (08:55 -0500)
As a side effect, this fixes a "Bug" warning.

Closes #40515.  Bugfix on 0.2.4.10-alpha.

changes/bug40515 [new file with mode: 0644]
src/core/or/origin_circuit_st.h
src/feature/client/circpathbias.c
src/feature/control/control_cmd.c

diff --git a/changes/bug40515 b/changes/bug40515
new file mode 100644 (file)
index 0000000..d315e28
--- /dev/null
@@ -0,0 +1,6 @@
+  o Minor bugfixes (controller, path bias):
+    - When a circuit's path is specified, in full or in part, from the
+      controller API, do not count that circuit towards our path-bias
+      calculations. (Doing so was incorrect, since we cannot tell whether
+      the controller is selecting relays randomly.)  Resolves a "Bug"
+      warning. Fixes bug 40515; bugfix on 0.2.4.10-alpha.
index c40e84aed886649de7d17ffde9b9eee62b08bb76..ca7c4b1bef6403b09e1dbc0f8071d9890cdea722 100644 (file)
@@ -182,6 +182,12 @@ struct origin_circuit_t {
    */
   unsigned first_hop_from_controller : 1;
 
+  /**
+   * If true, this circuit's path has been chosen, in full or in part,
+   * by the controller API, and it's okay to ignore checks that we'd
+   * usually do on the path as whole. */
+  unsigned int any_hop_from_controller : 1;
+
   /**
    * Tristate variable to guard against pathbias miscounting
    * due to circuit purpose transitions changing the decision
index 4d27553926f3677d35a7ca6ac95ec0f66ce1370f..29264135f97e44aa124f1d8d63f139d5d45c3350 100644 (file)
@@ -363,6 +363,17 @@ pathbias_should_count(origin_circuit_t *circ)
     return 0;
   }
 
+  /* Ignore circuits where the controller helped choose the path.  When
+   * this happens, we can't be sure whether the path was chosen randomly
+   * or not. */
+  if (circ->any_hop_from_controller) {
+    /* (In this case, we _don't_ check to see if shouldcount is changing,
+     * since it's possible that an already-created circuit later gets extended
+     * by the controller. */
+    circ->pathbias_shouldcount = PATHBIAS_SHOULDCOUNT_IGNORED;
+    return 0;
+  }
+
   /* Completely ignore one hop circuits */
   if (circ->build_state->onehop_tunnel ||
       circ->build_state->desired_path_len == 1) {
index b4d7228b51e3339731445e02bc79675d06fe8119..a1c5e55fe1073e63427477d5a11d67bb284dfdce 100644 (file)
@@ -822,6 +822,8 @@ handle_control_extendcircuit(control_connection_t *conn,
     circ->first_hop_from_controller = 1;
   }
 
+  circ->any_hop_from_controller = 1;
+
   /* now circ refers to something that is ready to be extended */
   first_node = zero_circ;
   SMARTLIST_FOREACH(nodes, const node_t *, node,