diff options
author | Nick Mathewson <nickm@torproject.org> | 2016-11-23 09:15:51 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2016-12-16 11:06:15 -0500 |
commit | f71be7434074a1b7f8508b96cbf55cee44afb993 (patch) | |
tree | c79b3e4e04e0806a396d81b0c04996f1e917cee2 /src | |
parent | 897626953b15ac216d27b3814804524caa9fdd1c (diff) | |
download | tor-f71be7434074a1b7f8508b96cbf55cee44afb993.tar.gz tor-f71be7434074a1b7f8508b96cbf55cee44afb993.zip |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/or/circuitlist.c | 5 | ||||
-rw-r--r-- | src/or/connection.c | 4 |
2 files changed, 9 insertions, 0 deletions
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index 2a03f8a0d9..9d7a5d7f0e 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 c2a7a87d41..25c75ff101 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); } |