mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Merge remote-tracking branch 'origin/maint-0.2.5'
This commit is contained in:
commit
c69e96680a
4
changes/bug12848
Normal file
4
changes/bug12848
Normal file
@ -0,0 +1,4 @@
|
||||
o Major bugfixes (relay):
|
||||
- Avoid queuing or sending destroy cells for circuit ID zero when
|
||||
we fail to send a CREATE cell. Fixes bug 12848; bugfix on
|
||||
0.0.8pre1. Found and fixed by "cypherpunks".
|
@ -2682,6 +2682,14 @@ int
|
||||
channel_send_destroy(circid_t circ_id, channel_t *chan, int reason)
|
||||
{
|
||||
tor_assert(chan);
|
||||
if (circ_id == 0) {
|
||||
log_warn(LD_BUG, "Attempted to send a destroy cell for circID 0 "
|
||||
"on a channel " U64_FORMAT " at %p in state %s (%d)",
|
||||
U64_PRINTF_ARG(chan->global_identifier),
|
||||
chan, channel_state_to_string(chan->state),
|
||||
chan->state);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check to make sure we can send on this channel first */
|
||||
if (!(chan->state == CHANNEL_STATE_CLOSING ||
|
||||
|
@ -549,6 +549,7 @@ circuit_handle_first_hop(origin_circuit_t *circ)
|
||||
log_debug(LD_CIRC,"Conn open. Delivering first onion skin.");
|
||||
if ((err_reason = circuit_send_next_onion_skin(circ)) < 0) {
|
||||
log_info(LD_CIRC,"circuit_send_next_onion_skin failed.");
|
||||
circ->base_.n_chan = NULL;
|
||||
return err_reason;
|
||||
}
|
||||
}
|
||||
@ -660,18 +661,18 @@ circuit_deliver_create_cell(circuit_t *circ, const create_cell_t *create_cell,
|
||||
static ratelim_t circid_warning_limit = RATELIM_INIT(9600);
|
||||
log_fn_ratelim(&circid_warning_limit, LOG_WARN, LD_CIRC,
|
||||
"failed to get unique circID.");
|
||||
return -1;
|
||||
goto error;
|
||||
}
|
||||
log_debug(LD_CIRC,"Chosen circID %u.", (unsigned)id);
|
||||
circuit_set_n_circid_chan(circ, id, circ->n_chan);
|
||||
|
||||
memset(&cell, 0, sizeof(cell_t));
|
||||
r = relayed ? create_cell_format_relayed(&cell, create_cell)
|
||||
: create_cell_format(&cell, create_cell);
|
||||
if (r < 0) {
|
||||
log_warn(LD_CIRC,"Couldn't format create cell");
|
||||
return -1;
|
||||
goto error;
|
||||
}
|
||||
log_debug(LD_CIRC,"Chosen circID %u.", (unsigned)id);
|
||||
circuit_set_n_circid_chan(circ, id, circ->n_chan);
|
||||
cell.circ_id = circ->n_circ_id;
|
||||
|
||||
append_cell_to_circuit_queue(circ, circ->n_chan, &cell,
|
||||
@ -695,6 +696,9 @@ circuit_deliver_create_cell(circuit_t *circ, const create_cell_t *create_cell,
|
||||
}
|
||||
|
||||
return 0;
|
||||
error:
|
||||
circ->n_chan = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/** We've decided to start our reachability testing. If all
|
||||
|
Loading…
Reference in New Issue
Block a user