From 20c867b52adf59aff14ccc0268bd06111b0867d8 Mon Sep 17 00:00:00 2001 From: Yuri Astrakhan Date: Thu, 9 Oct 2025 02:00:49 -0400 Subject: [PATCH] fix: return `None` if varint is too big for type --- src/varint.rs | 4 ++-- src/varint_tests.rs | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) 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"); + } }