[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(), &ocirc->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