From 6d876bd2a8e32b6366660ee044481eb715ffb010 Mon Sep 17 00:00:00 2001
From: Matt Johnston <matt@ucc.asn.au>
Date: Mon, 27 Jun 2022 23:14:15 +0800
Subject: [PATCH] fix pending adjust, missing channel write waker

---
 async/src/async_door.rs | 10 +++++++---
 sshproto/src/channel.rs |  1 +
 sshproto/src/runner.rs  |  1 +
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/async/src/async_door.rs b/async/src/async_door.rs
index 13ae342..4507053 100644
--- a/async/src/async_door.rs
+++ b/async/src/async_door.rs
@@ -404,13 +404,17 @@ fn chan_poll_write<'a>(
     trace!("chan write");
 
     let mut p = poll_lock(door.inner.clone(), cx, lock_fut);
-    let runner = match p {
-        Poll::Ready(ref mut i) => &mut i.runner,
+    let inner = match p {
+        Poll::Ready(ref mut i) => i,
         Poll::Pending => return Poll::Pending,
     };
+    let runner = &mut inner.runner;
 
     match runner.channel_send(chan, ext, buf) {
-        Ok(Some(l)) if l == 0 => Poll::Pending,
+        Ok(Some(l)) if l == 0 => {
+            inner.chan_write_wakers.insert((chan, ext), cx.waker().clone());
+            Poll::Pending
+        }
         Ok(Some(l)) => Poll::Ready(Ok(l)),
         // return 0 for EOF
         Ok(None) => Poll::Ready(Ok(0)),
diff --git a/sshproto/src/channel.rs b/sshproto/src/channel.rs
index 8e50793..d86fdeb 100644
--- a/sshproto/src/channel.rs
+++ b/sshproto/src/channel.rs
@@ -439,6 +439,7 @@ impl Channel {
         let send = self.send.as_mut().trap()?;
         if self.pending_adjust > self.full_window / 2 {
             let adjust = self.pending_adjust as u32;
+            self.pending_adjust = 0;
             let p = packets::ChannelWindowAdjust { num: send.num, adjust }.into();
             Ok(Some(p))
         } else {
diff --git a/sshproto/src/runner.rs b/sshproto/src/runner.rs
index cff3474..0135831 100644
--- a/sshproto/src/runner.rs
+++ b/sshproto/src/runner.rs
@@ -183,6 +183,7 @@ impl<'a> Runner<'a> {
     ) -> Result<Option<usize>> {
         let len = self.ready_channel_send(chan);
         let len = match len {
+            Some(l) if l == 0 => return Ok(Some(0)),
             Some(l) => l,
             None => return Ok(None),
         };
-- 
GitLab