aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/or/circuituse.c1
-rw-r--r--src/core/or/connection_edge.c19
-rw-r--r--src/core/or/connection_edge.h1
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;