diff --git a/src/varint.rs b/src/varint.rs index 61032d2..db1dadd 100644 --- a/src/varint.rs +++ b/src/varint.rs @@ -84,7 +84,7 @@ macro_rules! impl_varint { fn decode_var(src: &[u8]) -> Option<(Self, usize)> { let (n, s) = u64::decode_var(src)?; - Some((n as Self, s)) + Some((>::try_from(n).ok()?, s)) } fn encode_var(self, dst: &mut [u8]) -> usize { @@ -100,7 +100,7 @@ macro_rules! impl_varint { fn decode_var(src: &[u8]) -> Option<(Self, usize)> { let (n, s) = i64::decode_var(src)?; - Some((n as Self, s)) + Some((>::try_from(n).ok()?, s)) } fn encode_var(self, dst: &mut [u8]) -> usize { diff --git a/src/varint_tests.rs b/src/varint_tests.rs index 7a543a7..1da7a52 100644 --- a/src/varint_tests.rs +++ b/src/varint_tests.rs @@ -209,4 +209,14 @@ mod tests { std::io::ErrorKind::InvalidData ); } + + #[test] + fn test_decode_var_too_big() { + assert_eq!(u8::decode_var(&0x1FF_u64.encode_var_vec()), None, "u8"); + assert_eq!(u16::decode_var(&0x1FFFF_u64.encode_var_vec()), None, "u16"); + assert_eq!(u32::decode_var(&0x1FFFFFFFF_u64.encode_var_vec()), None, "u32"); + assert_eq!(i8::decode_var(&0x80_i64.encode_var_vec()), None, "i8"); + assert_eq!(i16::decode_var(&0x8000_i64.encode_var_vec()), None, "i16"); + assert_eq!(i32::decode_var(&0x80000000_i64.encode_var_vec()), None, "i32"); + } }