From dd085d42f96e39f9387aa1d7a306100c0d7df305 Mon Sep 17 00:00:00 2001 From: Nick Mathewson Date: Mon, 15 Nov 2021 08:55:47 -0500 Subject: Do not count controller-selected paths towards path bias. As a side effect, this fixes a "Bug" warning. Closes #40515. Bugfix on 0.2.4.10-alpha. --- changes/bug40515 | 6 ++++++ src/core/or/origin_circuit_st.h | 6 ++++++ src/feature/client/circpathbias.c | 11 +++++++++++ src/feature/control/control_cmd.c | 2 ++ 4 files changed, 25 insertions(+) create mode 100644 changes/bug40515 diff --git a/changes/bug40515 b/changes/bug40515 new file mode 100644 index 0000000000..d315e28411 --- /dev/null +++ b/changes/bug40515 @@ -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. diff --git a/src/core/or/origin_circuit_st.h b/src/core/or/origin_circuit_st.h index c40e84aed8..ca7c4b1bef 100644 --- a/src/core/or/origin_circuit_st.h +++ b/src/core/or/origin_circuit_st.h @@ -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 diff --git a/src/feature/client/circpathbias.c b/src/feature/client/circpathbias.c index 4d27553926..29264135f9 100644 --- a/src/feature/client/circpathbias.c +++ b/src/feature/client/circpathbias.c @@ -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) { diff --git a/src/feature/control/control_cmd.c b/src/feature/control/control_cmd.c index b4d7228b51..a1c5e55fe1 100644 --- a/src/feature/control/control_cmd.c +++ b/src/feature/control/control_cmd.c @@ -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, -- cgit v1.2.3-54-g00ecf