mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 23:53:32 +01:00
Handle n_mux/p_mux properly in circuitmux.c
This commit is contained in:
parent
c3ebd0340c
commit
8004448635
@ -340,7 +340,8 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Figure out which channel we're using, and get the circuit's current
|
* Figure out which channel we're using, and get the circuit's current
|
||||||
* cell count and circuit ID.
|
* cell count and circuit ID; assert that the circuit is not already
|
||||||
|
* attached to another mux.
|
||||||
*/
|
*/
|
||||||
if (direction == CELL_DIRECTION_OUT) {
|
if (direction == CELL_DIRECTION_OUT) {
|
||||||
/* It's n_chan */
|
/* It's n_chan */
|
||||||
@ -376,13 +377,16 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
|
|||||||
"Circuit %u on channel " U64_FORMAT " was already attached to "
|
"Circuit %u on channel " U64_FORMAT " was already attached to "
|
||||||
"cmux %p (trying to attach to %p)",
|
"cmux %p (trying to attach to %p)",
|
||||||
circ_id, U64_PRINTF_ARG(channel_id),
|
circ_id, U64_PRINTF_ARG(channel_id),
|
||||||
circ->mux, cmux);
|
((direction == CELL_DIRECTION_OUT) ?
|
||||||
|
circ->n_mux : TO_OR_CIRCUIT(circ)->p_mux),
|
||||||
|
cmux);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The mux pointer on the circuit should match this cmux, and the
|
* The mux pointer on this circuit and the direction in result should
|
||||||
* direction in result should match; otherwise assert.
|
* match; otherwise assert.
|
||||||
*/
|
*/
|
||||||
tor_assert(circ->mux == cmux);
|
if (direction == CELL_DIRECTION_OUT) tor_assert(circ->n_mux == cmux);
|
||||||
|
else tor_assert(TO_OR_CIRCUIT(circ)->p_mux == cmux);
|
||||||
tor_assert(hashent->muxinfo.direction == direction);
|
tor_assert(hashent->muxinfo.direction == direction);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -407,8 +411,12 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
|
|||||||
"Attaching circuit %u on channel " U64_FORMAT " to cmux %p",
|
"Attaching circuit %u on channel " U64_FORMAT " to cmux %p",
|
||||||
circ_id, U64_PRINTF_ARG(channel_id), cmux);
|
circ_id, U64_PRINTF_ARG(channel_id), cmux);
|
||||||
|
|
||||||
/* Assert that the circuit doesn't already have a mux */
|
/*
|
||||||
tor_assert(circ->mux == NULL);
|
* Assert that the circuit doesn't already have a mux for this
|
||||||
|
* direction.
|
||||||
|
*/
|
||||||
|
if (direction == CELL_DIRECTION_OUT) tor_assert(circ->n_mux == NULL);
|
||||||
|
else tor_assert(TO_OR_CIRCUIT(circ)->p_mux == NULL);
|
||||||
|
|
||||||
/* Insert it in the map */
|
/* Insert it in the map */
|
||||||
hashent = tor_malloc_zero(sizeof(*hashent));
|
hashent = tor_malloc_zero(sizeof(*hashent));
|
||||||
@ -419,8 +427,9 @@ circuitmux_attach_circuit(circuitmux_t *cmux, circuit_t *circ,
|
|||||||
HT_INSERT(chanid_circid_muxinfo_map, cmux->chanid_circid_map,
|
HT_INSERT(chanid_circid_muxinfo_map, cmux->chanid_circid_map,
|
||||||
hashent);
|
hashent);
|
||||||
|
|
||||||
/* Set the circuit's mux */
|
/* Set the circuit's mux for this direction */
|
||||||
circ->mux = cmux;
|
if (direction == CELL_DIRECTION_OUT) circ->n_mux = cmux;
|
||||||
|
else TO_OR_CIRCUIT(circ)->p_mux = cmux;
|
||||||
|
|
||||||
/* Make sure the next/prev pointers are NULL */
|
/* Make sure the next/prev pointers are NULL */
|
||||||
if (direction == CELL_DIRECTION_OUT) {
|
if (direction == CELL_DIRECTION_OUT) {
|
||||||
@ -494,6 +503,9 @@ circuitmux_detach_circuit(circuitmux_t *cmux, circuit_t *circ)
|
|||||||
|
|
||||||
/* Consistency check: the direction must match the direction searched */
|
/* Consistency check: the direction must match the direction searched */
|
||||||
tor_assert(last_searched_direction == hashent->muxinfo.direction);
|
tor_assert(last_searched_direction == hashent->muxinfo.direction);
|
||||||
|
/* Clear the circuit's mux for this direction */
|
||||||
|
if (last_searched_direction == CELL_DIRECTION_OUT) circ->n_mux = NULL;
|
||||||
|
else TO_OR_CIRCUIT(circ)->p_mux = NULL;
|
||||||
|
|
||||||
/* Free the hash entry */
|
/* Free the hash entry */
|
||||||
tor_free(hashent);
|
tor_free(hashent);
|
||||||
|
@ -2650,7 +2650,7 @@ typedef struct circuit_t {
|
|||||||
* Circuit mux associated with n_chan to which this circuit is attached;
|
* Circuit mux associated with n_chan to which this circuit is attached;
|
||||||
* NULL if we have no n_chan.
|
* NULL if we have no n_chan.
|
||||||
*/
|
*/
|
||||||
circuitmux_t *mux;
|
circuitmux_t *n_mux;
|
||||||
|
|
||||||
/** Queue of cells waiting to be transmitted on n_chan */
|
/** Queue of cells waiting to be transmitted on n_chan */
|
||||||
cell_queue_t n_chan_cells;
|
cell_queue_t n_chan_cells;
|
||||||
@ -2916,6 +2916,11 @@ typedef struct or_circuit_t {
|
|||||||
cell_queue_t p_chan_cells;
|
cell_queue_t p_chan_cells;
|
||||||
/** The channel that is previous in this circuit. */
|
/** The channel that is previous in this circuit. */
|
||||||
channel_t *p_chan;
|
channel_t *p_chan;
|
||||||
|
/**
|
||||||
|
* Circuit mux associated with p_chan to which this circuit is attached;
|
||||||
|
* NULL if we have no p_chan.
|
||||||
|
*/
|
||||||
|
circuitmux_t *p_mux;
|
||||||
/** Linked list of Exit streams associated with this circuit. */
|
/** Linked list of Exit streams associated with this circuit. */
|
||||||
edge_connection_t *n_streams;
|
edge_connection_t *n_streams;
|
||||||
/** Linked list of Exit streams associated with this circuit that are
|
/** Linked list of Exit streams associated with this circuit that are
|
||||||
|
Loading…
Reference in New Issue
Block a user