[tor-commits] [tor/main] kist: Don't try to flush empty outbuf

dgoulet at torproject.org dgoulet at torproject.org
Wed Feb 9 14:52:42 UTC 2022


commit 763d72238d84ff5c2c0a889d15f25a145046c9e5
Author: David Goulet <dgoulet at torproject.org>
Date:   Tue Feb 8 09:31:17 2022 -0500

    kist: Don't try to flush empty outbuf
    
    It is possible that a scheduled channel ended up with 0 bytes in its
    outbuf after the scheduling loop and having an outbuf table entry
    indicating that we need to flush bytes on the wire after the loop.
    
    This lead to attempt to write 0 bytes up to the TLS layer that would
    prevent such action.
    
    All in all, this fixes wasted CPU cycles on attempting to flush nothing.
    
    Fixes #40548
    
    Signed-off-by: David Goulet <dgoulet at torproject.org>
---
 changes/ticket40548          |  4 ++++
 src/core/or/scheduler_kist.c | 12 ++++++++++--
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/changes/ticket40548 b/changes/ticket40548
new file mode 100644
index 0000000000..277bb577a4
--- /dev/null
+++ b/changes/ticket40548
@@ -0,0 +1,4 @@
+  o Minor bugfixes (cell scheduling):
+    - Don't attempt to write 0 bytes after a cell scheduling loop. No empty
+      payload was put on the wire. Fixes bug 40548; bugfix on 0.3.5.1-alpha.
+    - Avoid writing empty payload with NSS write.
diff --git a/src/core/or/scheduler_kist.c b/src/core/or/scheduler_kist.c
index eba55f6497..52bc62f1b4 100644
--- a/src/core/or/scheduler_kist.c
+++ b/src/core/or/scheduler_kist.c
@@ -465,9 +465,17 @@ MOCK_IMPL(int, channel_should_write_to_kernel,
 MOCK_IMPL(void, channel_write_to_kernel, (channel_t *chan))
 {
   tor_assert(chan);
+
+  /* This is possible because a channel might have an outbuf table entry even
+   * though it has no more cells in its outbuf. Just move on. */
+  size_t outbuf_len = channel_outbuf_length(chan);
+  if (outbuf_len == 0) {
+    return;
+  }
+
   log_debug(LD_SCHED, "Writing %lu bytes to kernel for chan %" PRIu64,
-            (unsigned long)channel_outbuf_length(chan),
-            chan->global_identifier);
+            (unsigned long) outbuf_len, chan->global_identifier);
+
   /* Note that 'connection_handle_write()' may change the scheduler state of
    * the channel during the scheduling loop with
    * 'connection_or_flushed_some()' -> 'scheduler_channel_wants_writes()'.



More information about the tor-commits mailing list