diff options
-rw-r--r-- | src/core/or/circuituse.c | 1 | ||||
-rw-r--r-- | src/core/or/connection_edge.c | 19 | ||||
-rw-r--r-- | src/core/or/connection_edge.h | 1 |
3 files changed, 21 insertions, 0 deletions
diff --git a/src/core/or/circuituse.c b/src/core/or/circuituse.c index b10c140253..6956cf9849 100644 --- a/src/core/or/circuituse.c +++ b/src/core/or/circuituse.c @@ -1458,6 +1458,7 @@ circuit_expire_old_circuits_clientside(void) if (circ->timestamp_dirty && circ->timestamp_dirty + get_options()->MaxCircuitDirtiness < now.tv_sec && + !connection_half_edges_waiting(TO_ORIGIN_CIRCUIT(circ)) && !TO_ORIGIN_CIRCUIT(circ)->p_streams /* nothing attached */ ) { log_debug(LD_CIRC, "Closing n_circ_id %u (dirty %ld sec ago, " "purpose %d)", diff --git a/src/core/or/connection_edge.c b/src/core/or/connection_edge.c index ee6ab8596c..e1eeb2f64f 100644 --- a/src/core/or/connection_edge.c +++ b/src/core/or/connection_edge.c @@ -675,6 +675,25 @@ connection_half_edge_add(const edge_connection_t *conn, smartlist_insert(circ->half_streams, insert_at, half_conn); } +/** + * Return true if the circuit has any half-closed connections + * that are still within the end_ack_expected_usec timestamp + * from now. + */ +bool +connection_half_edges_waiting(const origin_circuit_t *circ) +{ + if (!circ->half_streams) + return false; + + SMARTLIST_FOREACH_BEGIN(circ->half_streams, const half_edge_t *, half_conn) { + if (half_conn->end_ack_expected_usec > monotime_absolute_usec()) + return true; + } SMARTLIST_FOREACH_END(half_conn); + + return false; +} + /** Release space held by <b>he</b> */ void half_edge_free_(half_edge_t *he) diff --git a/src/core/or/connection_edge.h b/src/core/or/connection_edge.h index 1816f2a463..59fc17dea5 100644 --- a/src/core/or/connection_edge.h +++ b/src/core/or/connection_edge.h @@ -218,6 +218,7 @@ int connection_half_edge_is_valid_end(smartlist_t *half_conns, streamid_t stream_id); int connection_half_edge_is_valid_resolved(smartlist_t *half_conns, streamid_t stream_id); +bool connection_half_edges_waiting(const origin_circuit_t *circ); size_t half_streams_get_total_allocation(void); struct half_edge_t; |