mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Move circuit-id-in-use check for CREATE cells to before all other checks
This means that we never send a DESTROY cell in response to an attempt to CREATE an existing circuit. Fixes bug 12191.
This commit is contained in:
parent
173a1afc58
commit
af53e4bd1c
6
changes/bug12191
Normal file
6
changes/bug12191
Normal file
@ -0,0 +1,6 @@
|
||||
o Minor bugfixes:
|
||||
|
||||
- We now drop CREATE cells for already-existent circuit IDs, regardless
|
||||
of other factors that might otherwise have called for DESTROY cells.
|
||||
Fixes bug 12191; bugfix on 0.2.???
|
||||
|
@ -227,6 +227,23 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
|
||||
(unsigned)cell->circ_id,
|
||||
U64_PRINTF_ARG(chan->global_identifier), chan);
|
||||
|
||||
if (circuit_id_in_use_on_channel(cell->circ_id, chan)) {
|
||||
const node_t *node = node_get_by_id(chan->identity_digest);
|
||||
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
|
||||
"Received CREATE cell (circID %u) for known circ. "
|
||||
"Dropping (age %d).",
|
||||
(unsigned)cell->circ_id,
|
||||
(int)(time(NULL) - channel_when_created(chan)));
|
||||
if (node) {
|
||||
char *p = esc_for_log(node_get_platform(node));
|
||||
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
|
||||
"Details: router %s, platform %s.",
|
||||
node_describe(node), p);
|
||||
tor_free(p);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (we_are_hibernating()) {
|
||||
log_info(LD_OR,
|
||||
"Received create cell but we're shutting down. Sending back "
|
||||
@ -274,23 +291,6 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
|
||||
return;
|
||||
}
|
||||
|
||||
if (circuit_id_in_use_on_channel(cell->circ_id, chan)) {
|
||||
const node_t *node = node_get_by_id(chan->identity_digest);
|
||||
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
|
||||
"Received CREATE cell (circID %u) for known circ. "
|
||||
"Dropping (age %d).",
|
||||
(unsigned)cell->circ_id,
|
||||
(int)(time(NULL) - channel_when_created(chan)));
|
||||
if (node) {
|
||||
char *p = esc_for_log(node_get_platform(node));
|
||||
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
|
||||
"Details: router %s, platform %s.",
|
||||
node_describe(node), p);
|
||||
tor_free(p);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
circ = or_circuit_new(cell->circ_id, chan);
|
||||
circ->base_.purpose = CIRCUIT_PURPOSE_OR;
|
||||
circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_ONIONSKIN_PENDING);
|
||||
|
Loading…
Reference in New Issue
Block a user