|
@@ -383,6 +383,11 @@ circuit_package_relay_cell(cell_t *cell, circuit_t *circ,
|
|
|
{
|
|
|
channel_t *chan; /* where to send the cell */
|
|
|
|
|
|
+ if (circ->marked_for_close) {
|
|
|
+ /* Circuit is marked; send nothing. */
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
if (cell_direction == CELL_DIRECTION_OUT) {
|
|
|
crypt_path_t *thishop; /* counter for repeated crypts */
|
|
|
chan = circ->n_chan;
|
|
@@ -696,6 +701,12 @@ connection_edge_send_command(edge_connection_t *fromconn,
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
+ if (circ->marked_for_close) {
|
|
|
+ /* The circuit has been marked, but not freed yet. When it's freed, it
|
|
|
+ * will mark this connection for close. */
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
return relay_send_command_from_edge(fromconn->stream_id, circ,
|
|
|
relay_command, payload,
|
|
|
payload_len, cpath_layer);
|