[tor-commits] [tor/master] When freeing a guard state, cancel it if its state is unknown
nickm at torproject.org
nickm at torproject.org
Fri Dec 16 16:26:18 UTC 2016
commit f71be7434074a1b7f8508b96cbf55cee44afb993
Author: Nick Mathewson <nickm at torproject.org>
Date: Wed Nov 23 09:15:51 2016 -0500
When freeing a guard state, cancel it if its state is unknown
We don't want a guard to stay "pending" forever if the
circuit_guard_state_t for it is freed before it succeeds or fails.
---
src/or/circuitlist.c | 5 +++++
src/or/connection.c | 4 ++++
2 files changed, 9 insertions(+)
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index 2a03f8a..9d7a5d7 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -885,6 +885,11 @@ circuit_free(circuit_t *circ)
cpath_ref_decref(ocirc->build_state->service_pending_final_cpath_ref);
}
tor_free(ocirc->build_state);
+
+ /* Cancel before freeing, if we haven't already succeeded or failed. */
+ if (ocirc->guard_state) {
+ entry_guard_cancel(get_guard_selection_info(), ô->guard_state);
+ }
circuit_guard_state_free(ocirc->guard_state);
circuit_clear_cpath(ocirc);
diff --git a/src/or/connection.c b/src/or/connection.c
index c2a7a87..25c75ff 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -634,6 +634,10 @@ connection_free_(connection_t *conn)
cached_dir_decref(dir_conn->cached_dir);
rend_data_free(dir_conn->rend_data);
+ if (dir_conn->guard_state) {
+ /* Cancel before freeing, if it's still there. */
+ entry_guard_cancel(get_guard_selection_info(), &dir_conn->guard_state);
+ }
circuit_guard_state_free(dir_conn->guard_state);
}
More information about the tor-commits
mailing list