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.
This commit is contained in:
Nick Mathewson 2016-11-23 09:15:51 -05:00
parent 897626953b
commit f71be74340
2 changed files with 9 additions and 0 deletions

View File

@ -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(), &ocirc->guard_state);
}
circuit_guard_state_free(ocirc->guard_state);
circuit_clear_cpath(ocirc);

View File

@ -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);
}