aboutsummaryrefslogtreecommitdiff
path: root/src/or/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/or/command.c')
-rw-r--r--src/or/command.c57
1 files changed, 31 insertions, 26 deletions
diff --git a/src/or/command.c b/src/or/command.c
index 9b3ff16f2..fa2a0e74e 100644
--- a/src/or/command.c
+++ b/src/or/command.c
@@ -227,6 +227,34 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
(unsigned)cell->circ_id,
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()) {
log_info(LD_OR,
"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;
}
- 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
* circ. */
if (chan->wide_circ_ids)
@@ -274,23 +294,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);
@@ -376,7 +379,7 @@ command_process_created_cell(cell_t *cell, channel_t *chan)
return;
}
- if (circ->n_circ_id != cell->circ_id) {
+ if (circ->n_circ_id != cell->circ_id || circ->n_chan != chan) {
log_fn(LOG_PROTOCOL_WARN,LD_PROTOCOL,
"got created cell from Tor client? Closing.");
circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL);
@@ -461,6 +464,7 @@ command_process_relay_cell(cell_t *cell, channel_t *chan)
}
if (!CIRCUIT_IS_ORIGIN(circ) &&
+ chan == TO_OR_CIRCUIT(circ)->p_chan &&
cell->circ_id == TO_OR_CIRCUIT(circ)->p_circ_id)
direction = CELL_DIRECTION_OUT;
else
@@ -529,6 +533,7 @@ command_process_destroy_cell(cell_t *cell, channel_t *chan)
circ->received_destroy = 1;
if (!CIRCUIT_IS_ORIGIN(circ) &&
+ chan == TO_OR_CIRCUIT(circ)->p_chan &&
cell->circ_id == TO_OR_CIRCUIT(circ)->p_circ_id) {
/* the destroy came from behind */
circuit_set_p_circid_chan(TO_OR_CIRCUIT(circ), 0, NULL);