From bec9e5e40d7ea832111e7cd84679d11259f7b874 Mon Sep 17 00:00:00 2001 From: DDtKey Date: Wed, 2 Feb 2022 22:07:55 +0300 Subject: [PATCH 1/3] fix: closed stream by CANCEL code --- src/proto/streams/state.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/proto/streams/state.rs b/src/proto/streams/state.rs index 1233e2352..9c1a4711a 100644 --- a/src/proto/streams/state.rs +++ b/src/proto/streams/state.rs @@ -420,6 +420,7 @@ impl State { pub fn ensure_recv_open(&self) -> Result { // TODO: Is this correct? match self.inner { + Closed(Cause::Error(Error::Reset(_, Reason::CANCEL, _))) => Ok(false), Closed(Cause::Error(ref e)) => Err(e.clone()), Closed(Cause::ScheduledLibraryReset(reason)) => { Err(proto::Error::library_go_away(reason)) From e4039e77f83b5a12ea04ec009d523268fe85060f Mon Sep 17 00:00:00 2001 From: Artem Medvedev Date: Mon, 5 Jun 2023 14:58:28 +0200 Subject: [PATCH 2/3] fix: do not ignore result of `ensure_recv_open` It may cause hanging, because result isn't checked --- src/proto/streams/recv.rs | 4 +++- src/proto/streams/streams.rs | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/proto/streams/recv.rs b/src/proto/streams/recv.rs index ec4db1c79..b8c5bf2ee 100644 --- a/src/proto/streams/recv.rs +++ b/src/proto/streams/recv.rs @@ -308,7 +308,9 @@ impl Recv { Some(Event::Headers(Client(response))) => Poll::Ready(Ok(response)), Some(_) => panic!("poll_response called after response returned"), None => { - stream.state.ensure_recv_open()?; + if !stream.state.ensure_recv_open()? { + return Poll::Ready(Ok(Response::new(()))) + } stream.recv_task = Some(cx.waker().clone()); Poll::Pending diff --git a/src/proto/streams/streams.rs b/src/proto/streams/streams.rs index dfc5c768b..1e97b3fb1 100644 --- a/src/proto/streams/streams.rs +++ b/src/proto/streams/streams.rs @@ -726,7 +726,10 @@ impl Inner { } // The stream must be receive open - stream.state.ensure_recv_open()?; + if !stream.state.ensure_recv_open()? { + return Ok(()) + } + stream.key() } None => { From 1cf443f8b78b0a439c361a3b54ee607cf7562154 Mon Sep 17 00:00:00 2001 From: Artem Medvedev Date: Tue, 6 Jun 2023 13:40:24 +0200 Subject: [PATCH 3/3] style: fix fmt --- src/proto/streams/recv.rs | 2 +- src/proto/streams/streams.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/proto/streams/recv.rs b/src/proto/streams/recv.rs index b8c5bf2ee..156d795e6 100644 --- a/src/proto/streams/recv.rs +++ b/src/proto/streams/recv.rs @@ -309,7 +309,7 @@ impl Recv { Some(_) => panic!("poll_response called after response returned"), None => { if !stream.state.ensure_recv_open()? { - return Poll::Ready(Ok(Response::new(()))) + return Poll::Ready(Ok(Response::new(()))); } stream.recv_task = Some(cx.waker().clone()); diff --git a/src/proto/streams/streams.rs b/src/proto/streams/streams.rs index 1e97b3fb1..0f21e939f 100644 --- a/src/proto/streams/streams.rs +++ b/src/proto/streams/streams.rs @@ -727,7 +727,7 @@ impl Inner { // The stream must be receive open if !stream.state.ensure_recv_open()? { - return Ok(()) + return Ok(()); } stream.key()