Merge branch 'bug12191_squashed'

This commit is contained in:
Nick Mathewson 2014-06-13 08:40:59 -04:00
commit cfca2a6037
2 changed files with 35 additions and 25 deletions

7
changes/bug12191 Normal file
View File

@ -0,0 +1,7 @@
o Minor bugfixes:
- We now drop CREATE cells for already-existent circuit IDs and
for zero-valued circuit IDs, regardless of other factors that
might otherwise have called for DESTROY cells. Fixes bug 12191;
bugfix on 0.0.8pre1.

View File

@ -227,6 +227,34 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
(unsigned)cell->circ_id, (unsigned)cell->circ_id,
U64_PRINTF_ARG(chan->global_identifier), chan); U64_PRINTF_ARG(chan->global_identifier), chan);
/* We check for the conditions that would make us drop the cell before
* we check for the conditions that would make us send a DESTROY back,
* since those conditions would make a DESTROY nonsensical. */
if (cell->circ_id == 0) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"Received a create cell (type %d) from %s with zero circID; "
" ignoring.", (int)cell->command,
channel_get_actual_remote_descr(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;
}
if (we_are_hibernating()) { if (we_are_hibernating()) {
log_info(LD_OR, log_info(LD_OR,
"Received create cell but we're shutting down. Sending back " "Received create cell but we're shutting down. Sending back "
@ -248,14 +276,6 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
return; return;
} }
if (cell->circ_id == 0) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"Received a create cell (type %d) from %s with zero circID; "
" ignoring.", (int)cell->command,
channel_get_actual_remote_descr(chan));
return;
}
/* If the high bit of the circuit ID is not as expected, close the /* If the high bit of the circuit ID is not as expected, close the
* circ. */ * circ. */
if (chan->wide_circ_ids) if (chan->wide_circ_ids)
@ -274,23 +294,6 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
return; 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 = or_circuit_new(cell->circ_id, chan);
circ->base_.purpose = CIRCUIT_PURPOSE_OR; circ->base_.purpose = CIRCUIT_PURPOSE_OR;
circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_ONIONSKIN_PENDING); circuit_set_state(TO_CIRCUIT(circ), CIRCUIT_STATE_ONIONSKIN_PENDING);