From: Ian Jackson Date: Sun, 1 Aug 2021 19:51:51 +0000 (+0100) Subject: change mimeswap error handling X-Git-Tag: hippotat/1.0.0~389 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ian/git?a=commitdiff_plain;h=4ef011f792c19baefad2eec79a4a9f7c35daff9a;p=hippotat.git change mimeswap error handling Signed-off-by: Ian Jackson --- diff --git a/Cargo.lock b/Cargo.lock index 097897d..61b1daf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -389,6 +389,7 @@ dependencies = [ "regex", "sha2", "structopt", + "thiserror", "tokio", "void", ] @@ -1017,6 +1018,26 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "thiserror" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tokio" version = "1.8.2" diff --git a/Cargo.toml b/Cargo.toml index 0b5abec..f9e5ee6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ log = "0.4" sha2 = "0.9" structopt = "0.3" tokio = { version = "1", features = ["full"] } +thiserror = "1" void = "1" # Not in sid: diff --git a/src/prelude.rs b/src/prelude.rs index 8375744..d87d4fb 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -35,6 +35,7 @@ pub use itertools::{iproduct, Itertools}; pub use lazy_regex::{regex_is_match, regex_replace_all}; pub use log::{debug, info, error}; pub use structopt::StructOpt; +pub use thiserror::Error; pub use tokio::io::AsyncBufReadExt; pub use tokio::pin; pub use tokio::select; diff --git a/src/slip.rs b/src/slip.rs index 763f24f..357a890 100644 --- a/src/slip.rs +++ b/src/slip.rs @@ -6,7 +6,13 @@ use crate::prelude::*; pub static SLIP_END_SLICE: &[u8] = &[SLIP_END]; -#[throws(AE)] +#[derive(Error,Debug,Copy,Clone)] +pub enum PacketError { + #[error("MTU exceeded ({len} > {mtu})")] MTU { len: usize, mtu: u32 }, + #[error("Invalid SLIP escape sequence")] SLIP, +} + +#[throws(PacketError)] pub fn check_checkmtu_mimeswap (mtu: u32, data: &mut [u8]) { @@ -14,7 +20,7 @@ pub fn check_checkmtu_mimeswap for mut packet in data.split_mut(|&c| c == SLIP_END) { if packet.len() > mtu.sat() { - throw!(anyhow!("MTU exceeded ({} > {})", packet.len(), mtu)); + throw!(PacketError::MTU { len: packet.len(), mtu }) } while let Some((i, was_mime)) = packet.iter().enumerate().find_map( @@ -29,7 +35,7 @@ pub fn check_checkmtu_mimeswap match packet.get(i+1) { Some(&SLIP_ESC_END) | Some(&SLIP_ESC_ESC) => Ok(()), - _ => Err(anyhow!("SLIP escape not followed by ESC_END or ESC_ESC")), + _ => throw!(PacketError::SLIP), }?; packet = &mut packet[i+2 ..]; } else {