diff --git a/crates/async-compression/src/generic/bufread/decoder.rs b/crates/async-compression/src/generic/bufread/decoder.rs index 35dc0cb0..ce827b3c 100644 --- a/crates/async-compression/src/generic/bufread/decoder.rs +++ b/crates/async-compression/src/generic/bufread/decoder.rs @@ -2,7 +2,7 @@ use crate::{ codecs::DecodeV2, core::util::{PartialBuffer, WriteBuffer}, }; -use std::{io::Result, ops::ControlFlow}; +use std::{io::Result, ops::ControlFlow, panic::AssertUnwindSafe}; #[derive(Debug)] enum State { @@ -10,7 +10,7 @@ enum State { Flushing, Done, Next, - Error(std::io::Error), + Error(AssertUnwindSafe), } #[derive(Debug)] @@ -55,7 +55,7 @@ impl Decoder { // ignore the first error, occurs when input is empty // but we need to run decode to flush Err(err) if !first => { - self.state = State::Error(err); + self.state = State::Error(AssertUnwindSafe(err)); if output.written_len() > 0 { return ControlFlow::Break(Ok(())); } else { @@ -73,7 +73,7 @@ impl Decoder { Ok(true) => { if self.multiple_members { if let Err(err) = decoder.reinit() { - self.state = State::Error(err); + self.state = State::Error(AssertUnwindSafe(err)); if output.written_len() > 0 { return ControlFlow::Break(Ok(())); } else { @@ -91,7 +91,7 @@ impl Decoder { } Ok(false) => State::Flushing, Err(err) => { - self.state = State::Error(err); + self.state = State::Error(AssertUnwindSafe(err)); if output.written_len() > 0 { return ControlFlow::Break(Ok(())); } else { @@ -119,7 +119,7 @@ impl Decoder { let State::Error(err) = std::mem::replace(&mut self.state, State::Done) else { unreachable!() }; - return ControlFlow::Break(Err(err)); + return ControlFlow::Break(Err(err.0)); } }; diff --git a/crates/async-compression/src/generic/bufread/encoder.rs b/crates/async-compression/src/generic/bufread/encoder.rs index dde539bb..9aca902e 100644 --- a/crates/async-compression/src/generic/bufread/encoder.rs +++ b/crates/async-compression/src/generic/bufread/encoder.rs @@ -2,7 +2,7 @@ use crate::{ codecs::EncodeV2, core::util::{PartialBuffer, WriteBuffer}, }; -use std::{io::Result, ops::ControlFlow}; +use std::{io::Result, ops::ControlFlow, panic::AssertUnwindSafe}; #[derive(Debug)] enum State { @@ -10,7 +10,7 @@ enum State { Flushing, Finishing, Done, - Error(std::io::Error), + Error(AssertUnwindSafe), } #[derive(Debug)] @@ -54,7 +54,7 @@ impl Encoder { State::Finishing } else { if let Err(err) = encoder.encode(input, output) { - self.state = State::Error(err); + self.state = State::Error(AssertUnwindSafe(err)); if output.written_len() > 0 { return ControlFlow::Break(Ok(())); } else { @@ -79,7 +79,7 @@ impl Encoder { } Ok(false) => State::Flushing, Err(err) => { - self.state = State::Error(err); + self.state = State::Error(AssertUnwindSafe(err)); if output.written_len() > 0 { return ControlFlow::Break(Ok(())); } else { @@ -92,7 +92,7 @@ impl Encoder { Ok(true) => State::Done, Ok(false) => State::Finishing, Err(err) => { - self.state = State::Error(err); + self.state = State::Error(AssertUnwindSafe(err)); if output.written_len() > 0 { return ControlFlow::Break(Ok(())); } else { @@ -107,7 +107,7 @@ impl Encoder { let State::Error(err) = std::mem::replace(&mut self.state, State::Done) else { unreachable!() }; - return ControlFlow::Break(Err(err)); + return ControlFlow::Break(Err(err.0)); } };