Skip to content

Commit 7a5133b

Browse files
committed
fix: return None if varint is too big for type
1 parent 5ef95f8 commit 7a5133b

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

src/varint.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ macro_rules! impl_varint {
8484

8585
fn decode_var(src: &[u8]) -> Option<(Self, usize)> {
8686
let (n, s) = u64::decode_var(src)?;
87-
Some((n as Self, s))
87+
Some((<Self as std::convert::TryFrom<u64>>::try_from(n).ok()?, s))
8888
}
8989

9090
fn encode_var(self, dst: &mut [u8]) -> usize {
@@ -100,7 +100,7 @@ macro_rules! impl_varint {
100100

101101
fn decode_var(src: &[u8]) -> Option<(Self, usize)> {
102102
let (n, s) = i64::decode_var(src)?;
103-
Some((n as Self, s))
103+
Some((<Self as std::convert::TryFrom<i64>>::try_from(n).ok()?, s))
104104
}
105105

106106
fn encode_var(self, dst: &mut [u8]) -> usize {

src/varint_tests.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,4 +209,14 @@ mod tests {
209209
std::io::ErrorKind::InvalidData
210210
);
211211
}
212+
213+
#[test]
214+
fn test_decode_var_too_big() {
215+
assert_eq!(u8::decode_var(&0x1FF_u64.encode_var_vec()), None, "u8");
216+
assert_eq!(u16::decode_var(&0x1FFFF_u64.encode_var_vec()), None, "u16");
217+
assert_eq!(u32::decode_var(&0x1FFFFFFFF_u64.encode_var_vec()), None, "u32");
218+
assert_eq!(i8::decode_var(&0x80_i64.encode_var_vec()), None, "i8");
219+
assert_eq!(i16::decode_var(&0x8000_i64.encode_var_vec()), None, "i16");
220+
assert_eq!(i32::decode_var(&0x80000000_i64.encode_var_vec()), None, "i32");
221+
}
212222
}

0 commit comments

Comments
 (0)