summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2023-08-28 14:08:39 -0400
committerDavid Goulet <dgoulet@torproject.org>2023-08-28 14:08:39 -0400
commit3aa937dd5ebce4764ee908d01fdae1e9bb4ded46 (patch)
tree76670894660cbc51c2edb3d502bea6131f68b1a0
parent532543e84a96fbc94e9b33b36100ef0046a50429 (diff)
parent888da0579d784977d049711388c1011bf522c227 (diff)
downloadtor-3aa937dd5ebce4764ee908d01fdae1e9bb4ded46.tar.gz
tor-3aa937dd5ebce4764ee908d01fdae1e9bb4ded46.zip
Merge branch 'tor-gitlab/mr/750' into maint-0.4.8
-rw-r--r--changes/bug408424
-rw-r--r--src/core/or/conflux.c6
-rw-r--r--src/core/or/conflux_util.c25
-rw-r--r--src/core/or/relay.c2
4 files changed, 37 insertions, 0 deletions
diff --git a/changes/bug40842 b/changes/bug40842
new file mode 100644
index 0000000000..bf3bd8bd03
--- /dev/null
+++ b/changes/bug40842
@@ -0,0 +1,4 @@
+ o Minor bugfixes (conflux):
+ - Prevent non-fatal assert stacktrace caused by using conflux
+ sets during their teardown process. Fixes bug 40842;
+ bugfix on 0.4.8.1-alpha.
diff --git a/src/core/or/conflux.c b/src/core/or/conflux.c
index 0082089504..0a2806b1dc 100644
--- a/src/core/or/conflux.c
+++ b/src/core/or/conflux.c
@@ -604,6 +604,12 @@ conflux_decide_next_circ(conflux_t *cfx)
// this once tuning is complete.
conflux_validate_legs(cfx);
+ /* If the conflux set is tearing down and has no current leg,
+ * bail and give up */
+ if (cfx->in_full_teardown) {
+ return NULL;
+ }
+
/* If we don't have a current leg yet, pick one.
* (This is the only non-const operation in this function). */
if (!cfx->curr_leg) {
diff --git a/src/core/or/conflux_util.c b/src/core/or/conflux_util.c
index 7e2e938ca4..31ab983f8f 100644
--- a/src/core/or/conflux_util.c
+++ b/src/core/or/conflux_util.c
@@ -38,10 +38,31 @@ circuit_get_package_window(circuit_t *circ,
tor_assert_nonfatal(circ->purpose ==
CIRCUIT_PURPOSE_CONFLUX_LINKED);
}
+ circuit_t *orig_circ = circ;
+
+ /* If conflux is in the process of tearing down the set,
+ * the package window is 0 -- there is no room. */
+ if (circ->conflux->in_full_teardown)
+ return 0;
+
circ = conflux_decide_next_circ(circ->conflux);
/* If conflux has no circuit to send on, the package window is 0. */
if (!circ) {
+ /* Bug #40842: Additional diagnostics for other potential cases */
+ if (!orig_circ->conflux->curr_leg) {
+ if (orig_circ->marked_for_close) {
+ log_warn(LD_BUG, "Conflux has no circuit to send on. "
+ "Circuit %p idx %d marked at line %s:%d",
+ orig_circ, orig_circ->global_circuitlist_idx,
+ orig_circ->marked_for_close_file,
+ orig_circ->marked_for_close);
+ } else {
+ log_warn(LD_BUG, "Conflux has no circuit to send on. "
+ "Circuit %p idx %d not marked for close.",
+ orig_circ, orig_circ->global_circuitlist_idx);
+ }
+ }
return 0;
}
@@ -76,6 +97,10 @@ conflux_can_send(conflux_t *cfx)
if (send_circ) {
return true;
} else {
+ if (BUG(!cfx->in_full_teardown && !cfx->curr_leg)) {
+ log_fn(LOG_WARN,
+ LD_BUG, "Conflux has no current circuit to send on. ");
+ }
return false;
}
}
diff --git a/src/core/or/relay.c b/src/core/or/relay.c
index 87f8053686..6abe802355 100644
--- a/src/core/or/relay.c
+++ b/src/core/or/relay.c
@@ -641,6 +641,8 @@ relay_send_command_from_edge_,(streamid_t stream_id, circuit_t *orig_circ,
if (BUG(!circ)) {
log_warn(LD_BUG, "No circuit to send for conflux for relay command %d, "
"called from %s:%d", relay_command, filename, lineno);
+ conflux_log_set(LOG_WARN, orig_circ->conflux,
+ CIRCUIT_IS_ORIGIN(orig_circ));
circ = orig_circ;
} else {
/* Conflux circuits always send multiplexed relay commands to