]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Don't assert when writing a cell to a CLOSING connection.
authorNick Mathewson <nickm@torproject.org>
Tue, 19 Mar 2013 20:35:40 +0000 (16:35 -0400)
committerNick Mathewson <nickm@torproject.org>
Tue, 19 Mar 2013 20:35:40 +0000 (16:35 -0400)
Instead, drop the cell.

Fixes another case of bug 7350; bugfix on 0.2.4.4-alpha

changes/bug7350 [new file with mode: 0644]
src/or/channel.c

diff --git a/changes/bug7350 b/changes/bug7350
new file mode 100644 (file)
index 0000000..b0ee9d0
--- /dev/null
@@ -0,0 +1,4 @@
+  o Major bugfixes:
+    - Avoid an assertion when we discover that we'd like to write a cell
+      onto a closing connection: just discard the cell. Fixes another
+      case of bug 7350; bugfix on 0.2.4.4-alpha.
index 82db061af95ff2f19584aef4079ed0aaf5d573fd..4e9086f2e648aaa69078551462ae4ddf4d35ab00 100644 (file)
@@ -1751,6 +1751,14 @@ channel_write_cell(channel_t *chan, cell_t *cell)
   tor_assert(chan);
   tor_assert(cell);
 
+  if (chan->state == CHANNEL_STATE_CLOSING) {
+    log_debug(LD_CHANNEL, "Discarding cell_t %p on closing channel %p with "
+              "global ID "U64_FORMAT, cell, chan,
+              U64_PRINTF_ARG(chan->global_identifier));
+    tor_free(cell);
+    return;
+  }
+
   log_debug(LD_CHANNEL,
             "Writing cell_t %p to channel %p with global ID "
             U64_FORMAT,
@@ -1777,6 +1785,14 @@ channel_write_packed_cell(channel_t *chan, packed_cell_t *packed_cell)
   tor_assert(chan);
   tor_assert(packed_cell);
 
+  if (chan->state == CHANNEL_STATE_CLOSING) {
+    log_debug(LD_CHANNEL, "Discarding packed_cell_t %p on closing channel %p "
+              "with global ID "U64_FORMAT, packed_cell, chan,
+              U64_PRINTF_ARG(chan->global_identifier));
+    packed_cell_free(packed_cell);
+    return;
+  }
+
   log_debug(LD_CHANNEL,
             "Writing packed_cell_t %p to channel %p with global ID "
             U64_FORMAT,
@@ -1805,6 +1821,14 @@ channel_write_var_cell(channel_t *chan, var_cell_t *var_cell)
   tor_assert(chan);
   tor_assert(var_cell);
 
+  if (chan->state == CHANNEL_STATE_CLOSING) {
+    log_debug(LD_CHANNEL, "Discarding var_cell_t %p on closing channel %p "
+              "with global ID "U64_FORMAT, var_cell, chan,
+              U64_PRINTF_ARG(chan->global_identifier));
+    var_cell_free(var_cell);
+    return;
+  }
+
   log_debug(LD_CHANNEL,
             "Writing var_cell_t %p to channel %p with global ID "
             U64_FORMAT,