Sfoglia il codice sorgente

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.
Nick Mathewson 7 anni fa
parent
commit
f71be74340
2 ha cambiato i file con 9 aggiunte e 0 eliminazioni
  1. 5 0
      src/or/circuitlist.c
  2. 4 0
      src/or/connection.c

+ 5 - 0
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);

+ 4 - 0
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);
   }