aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2022-04-14 09:37:46 -0400
committerDavid Goulet <dgoulet@torproject.org>2022-04-14 09:37:46 -0400
commit32356a607608596a0607c80eb8505dedfc315894 (patch)
tree2d2ccd0a169617baab53ad05664c253cf2a57af9
parentb33f69abb54d06b324301977e87171d5902a39bf (diff)
parentdc90226cc3c7c74164f8feb1f50d2fbcf0941a9d (diff)
downloadtor-32356a607608596a0607c80eb8505dedfc315894.tar.gz
tor-32356a607608596a0607c80eb8505dedfc315894.zip
Merge branch 'maint-0.4.5' into maint-0.4.6
-rw-r--r--changes/bug405156
-rw-r--r--src/core/or/origin_circuit_st.h6
-rw-r--r--src/feature/client/circpathbias.c11
-rw-r--r--src/feature/control/control_cmd.c2
4 files changed, 25 insertions, 0 deletions
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 9264077c50..6c86a56000 100644
--- a/src/core/or/origin_circuit_st.h
+++ b/src/core/or/origin_circuit_st.h
@@ -180,6 +180,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
* of pathbias_should_count(). This variable is informational
diff --git a/src/feature/client/circpathbias.c b/src/feature/client/circpathbias.c
index 9c0ecc56ad..ff9e05a645 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 bd0d41d29e..94a5645cff 100644
--- a/src/feature/control/control_cmd.c
+++ b/src/feature/control/control_cmd.c
@@ -817,6 +817,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,