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