Fix 'warning: circuit was already inactive' and assert in circuitmux_make_circuit_inactive() during circuitmux_detach_all_circuits()

This commit is contained in:
Andrea Shepard 2012-10-05 21:57:42 -07:00
parent c9e48ded5d
commit 1bc9a040f7

View File

@ -386,7 +386,6 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux)
i = HT_START(chanid_circid_muxinfo_map, cmux->chanid_circid_map); i = HT_START(chanid_circid_muxinfo_map, cmux->chanid_circid_map);
while (i) { while (i) {
to_remove = *i; to_remove = *i;
i = HT_NEXT_RMV(chanid_circid_muxinfo_map, cmux->chanid_circid_map, i);
if (to_remove) { if (to_remove) {
/* Find a channel and circuit */ /* Find a channel and circuit */
chan = channel_find_by_global_id(to_remove->chan_id); chan = channel_find_by_global_id(to_remove->chan_id);
@ -401,7 +400,11 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux)
* Update active_circuits et al.; this does policy notifies, so * Update active_circuits et al.; this does policy notifies, so
* comes before freeing policy data * comes before freeing policy data
*/ */
if (to_remove->muxinfo.cell_count > 0) {
circuitmux_make_circuit_inactive(cmux, circ, CELL_DIRECTION_OUT); circuitmux_make_circuit_inactive(cmux, circ, CELL_DIRECTION_OUT);
}
/* Clear n_mux */ /* Clear n_mux */
circ->n_mux = NULL; circ->n_mux = NULL;
} else if (circ->magic == OR_CIRCUIT_MAGIC) { } else if (circ->magic == OR_CIRCUIT_MAGIC) {
@ -409,7 +412,11 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux)
* Update active_circuits et al.; this does policy notifies, so * Update active_circuits et al.; this does policy notifies, so
* comes before freeing policy data * comes before freeing policy data
*/ */
if (to_remove->muxinfo.cell_count > 0) {
circuitmux_make_circuit_inactive(cmux, circ, CELL_DIRECTION_IN); circuitmux_make_circuit_inactive(cmux, circ, CELL_DIRECTION_IN);
}
/* /*
* It has a sensible p_chan and direction == CELL_DIRECTION_IN, * It has a sensible p_chan and direction == CELL_DIRECTION_IN,
* so clear p_mux. * so clear p_mux.
@ -456,11 +463,13 @@ circuitmux_detach_all_circuits(circuitmux_t *cmux)
/* Assert that we don't have un-freed policy data for this circuit */ /* Assert that we don't have un-freed policy data for this circuit */
tor_assert(to_remove->muxinfo.policy_data == NULL); tor_assert(to_remove->muxinfo.policy_data == NULL);
}
i = HT_NEXT_RMV(chanid_circid_muxinfo_map, cmux->chanid_circid_map, i);
/* Free it */ /* Free it */
tor_free(to_remove); tor_free(to_remove);
} }
}
cmux->n_circuits = 0; cmux->n_circuits = 0;
cmux->n_active_circuits = 0; cmux->n_active_circuits = 0;