aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2014-06-11 09:33:20 -0400
committerNick Mathewson <nickm@torproject.org>2014-06-13 08:39:39 -0400
commitf9f450d688cc74403393dbe579ca9d92d98bfe13 (patch)
tree871a95d2981ed9f35f2e8bfff37cf20ba1b74d4b
parentaf53e4bd1c9aa655ce4faacb957ad7603b9c4825 (diff)
downloadtor-f9f450d688cc74403393dbe579ca9d92d98bfe13.tar
tor-f9f450d688cc74403393dbe579ca9d92d98bfe13.tar.gz
Also raise the check for 0 circuit ID in created cell.
And add a comment about why conditions that would cause us to drop a cell should get checked before actions that would cause us to send a destroy cell. Spotted by 'cypherpunks'. And note that these issues have been present since 0.0.8pre1 (commit 0da256ef), where we added a "shutting down" state, and started responding to all create cells with DESTROY when shutting down.
-rw-r--r--changes/bug121917
-rw-r--r--src/or/command.c19
2 files changed, 15 insertions, 11 deletions
diff --git a/changes/bug12191 b/changes/bug12191
index 7fe1c550b..77589ab31 100644
--- a/changes/bug12191
+++ b/changes/bug12191
@@ -1,6 +1,7 @@
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.???
+ - 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.
diff --git a/src/or/command.c b/src/or/command.c
index 51fb64044..fa2a0e74e 100644
--- a/src/or/command.c
+++ b/src/or/command.c
@@ -227,6 +227,17 @@ 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,
@@ -265,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)