From e4039e77f83b5a12ea04ec009d523268fe85060f Mon Sep 17 00:00:00 2001 From: Artem Medvedev Date: Mon, 5 Jun 2023 14:58:28 +0200 Subject: [PATCH 1/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 2/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() From e92e0838ff41ae67b65be53fb86f0b2e961b0cb6 Mon Sep 17 00:00:00 2001 From: Artem Medvedev Date: Fri, 21 Jul 2023 03:45:36 +0200 Subject: [PATCH 3/3] fix: return errors instead empty result --- src/proto/streams/recv.rs | 6 +++++- src/proto/streams/streams.rs | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/proto/streams/recv.rs b/src/proto/streams/recv.rs index 9be3c9d32..0063942a4 100644 --- a/src/proto/streams/recv.rs +++ b/src/proto/streams/recv.rs @@ -319,7 +319,11 @@ impl Recv { Some(_) => panic!("poll_response called after response returned"), None => { if !stream.state.ensure_recv_open()? { - return Poll::Ready(Ok(Response::new(()))); + proto_err!(stream: "poll_response: stream={:?} is not opened;", stream.id); + return Poll::Ready(Err(Error::library_reset( + stream.id, + Reason::PROTOCOL_ERROR, + ))); } stream.recv_task = Some(cx.waker().clone()); diff --git a/src/proto/streams/streams.rs b/src/proto/streams/streams.rs index f898d9e02..02a0f61b6 100644 --- a/src/proto/streams/streams.rs +++ b/src/proto/streams/streams.rs @@ -727,7 +727,8 @@ impl Inner { // The stream must be receive open if !stream.state.ensure_recv_open()? { - return Ok(()); + proto_err!(conn: "recv_push_promise: initiating stream is not opened"); + return Err(Error::library_go_away(Reason::PROTOCOL_ERROR)); } stream.key()