Added `additional` to the `UnexpectedEnd` decode error (#522)

This commit is contained in:
Trangar 2022-03-17 11:40:10 +01:00 committed by GitHub
parent a7fba80e23
commit 6693276e95
4 changed files with 147 additions and 56 deletions

View File

@ -75,7 +75,9 @@ impl<'storage> Reader for SliceReader<'storage> {
#[inline(always)] #[inline(always)]
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> { fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
if bytes.len() > self.slice.len() { if bytes.len() > self.slice.len() {
return Err(DecodeError::UnexpectedEnd); return Err(DecodeError::UnexpectedEnd {
additional: bytes.len() - self.slice.len(),
});
} }
let (read_slice, remaining) = self.slice.split_at(bytes.len()); let (read_slice, remaining) = self.slice.split_at(bytes.len());
bytes.copy_from_slice(read_slice); bytes.copy_from_slice(read_slice);
@ -99,7 +101,9 @@ impl<'storage> BorrowReader<'storage> for SliceReader<'storage> {
#[inline(always)] #[inline(always)]
fn take_bytes(&mut self, length: usize) -> Result<&'storage [u8], DecodeError> { fn take_bytes(&mut self, length: usize) -> Result<&'storage [u8], DecodeError> {
if length > self.slice.len() { if length > self.slice.len() {
return Err(DecodeError::UnexpectedEnd); return Err(DecodeError::UnexpectedEnd {
additional: length - self.slice.len(),
});
} }
let (read_slice, remaining) = self.slice.split_at(length); let (read_slice, remaining) = self.slice.split_at(length);
self.slice = remaining; self.slice = remaining;

View File

@ -68,7 +68,14 @@ impl core::fmt::Display for EncodeError {
#[derive(Debug, PartialEq)] #[derive(Debug, PartialEq)]
pub enum DecodeError { pub enum DecodeError {
/// The reader reached its end but more bytes were expected. /// The reader reached its end but more bytes were expected.
UnexpectedEnd, UnexpectedEnd {
/// Gives an estimate of how many extra bytes are needed.
///
/// **Note**: this is only an estimate and not indicative of the actual bytes needed.
///
/// **Note**: Bincode has no look-ahead mechanism. This means that this will only return the amount of bytes to be read for the current action, and not take into account the entire data structure being read.
additional: usize,
},
/// The given configuration limit was exceeded /// The given configuration limit was exceeded
LimitExceeded, LimitExceeded,

View File

@ -49,7 +49,9 @@ where
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> { fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
match self.reader.read_exact(bytes) { match self.reader.read_exact(bytes) {
Ok(_) => Ok(()), Ok(_) => Ok(()),
Err(_) => Err(DecodeError::UnexpectedEnd), Err(_) => Err(DecodeError::UnexpectedEnd {
additional: bytes.len(),
}),
} }
} }
} }
@ -61,7 +63,9 @@ where
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> { fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
match self.read_exact(bytes) { match self.read_exact(bytes) {
Ok(_) => Ok(()), Ok(_) => Ok(()),
Err(_) => Err(DecodeError::UnexpectedEnd), Err(_) => Err(DecodeError::UnexpectedEnd {
additional: bytes.len(),
}),
} }
} }

View File

@ -422,8 +422,8 @@ fn test_decode_u16() {
found: IntegerType::U128, found: IntegerType::U128,
}, },
), ),
(&[U16_BYTE], DecodeError::UnexpectedEnd), (&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd), (&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
]; ];
for (slice, expected) in errors { for (slice, expected) in errors {
@ -466,12 +466,18 @@ fn test_decode_u32() {
found: IntegerType::U128, found: IntegerType::U128,
}, },
), ),
(&[U16_BYTE], DecodeError::UnexpectedEnd), (&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd), (&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
(&[U32_BYTE], DecodeError::UnexpectedEnd), (&[U32_BYTE], DecodeError::UnexpectedEnd { additional: 4 }),
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd), (&[U32_BYTE, 0], DecodeError::UnexpectedEnd { additional: 3 }),
(&[U32_BYTE, 0, 0], DecodeError::UnexpectedEnd), (
(&[U32_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd), &[U32_BYTE, 0, 0],
DecodeError::UnexpectedEnd { additional: 2 },
),
(
&[U32_BYTE, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 1 },
),
]; ];
for (slice, expected) in errors { for (slice, expected) in errors {
@ -512,20 +518,44 @@ fn test_decode_u64() {
found: IntegerType::U128, found: IntegerType::U128,
}, },
), ),
(&[U16_BYTE], DecodeError::UnexpectedEnd), (&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd), (&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
(&[U32_BYTE], DecodeError::UnexpectedEnd), (&[U32_BYTE], DecodeError::UnexpectedEnd { additional: 4 }),
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd), (&[U32_BYTE, 0], DecodeError::UnexpectedEnd { additional: 3 }),
(&[U32_BYTE, 0, 0], DecodeError::UnexpectedEnd), (
(&[U32_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd), &[U32_BYTE, 0, 0],
(&[U64_BYTE], DecodeError::UnexpectedEnd), DecodeError::UnexpectedEnd { additional: 2 },
(&[U64_BYTE, 0], DecodeError::UnexpectedEnd), ),
(&[U64_BYTE, 0, 0], DecodeError::UnexpectedEnd), (
(&[U64_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd), &[U32_BYTE, 0, 0, 0],
(&[U64_BYTE, 0, 0, 0, 0], DecodeError::UnexpectedEnd), DecodeError::UnexpectedEnd { additional: 1 },
(&[U64_BYTE, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd), ),
(&[U64_BYTE, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd), (&[U64_BYTE], DecodeError::UnexpectedEnd { additional: 8 }),
(&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd), (&[U64_BYTE, 0], DecodeError::UnexpectedEnd { additional: 7 }),
(
&[U64_BYTE, 0, 0],
DecodeError::UnexpectedEnd { additional: 6 },
),
(
&[U64_BYTE, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 5 },
),
(
&[U64_BYTE, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 4 },
),
(
&[U64_BYTE, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 3 },
),
(
&[U64_BYTE, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 2 },
),
(
&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 1 },
),
]; ];
for (slice, expected) in errors { for (slice, expected) in errors {
@ -564,58 +594,104 @@ fn test_decode_u128() {
} }
let errors: &[(&[u8], DecodeError)] = &[ let errors: &[(&[u8], DecodeError)] = &[
(&[U16_BYTE], DecodeError::UnexpectedEnd), (&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd), (&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
(&[U32_BYTE], DecodeError::UnexpectedEnd), (&[U32_BYTE], DecodeError::UnexpectedEnd { additional: 4 }),
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd), (&[U32_BYTE, 0], DecodeError::UnexpectedEnd { additional: 3 }),
(&[U32_BYTE, 0, 0], DecodeError::UnexpectedEnd), (
(&[U32_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd), &[U32_BYTE, 0, 0],
(&[U64_BYTE], DecodeError::UnexpectedEnd), DecodeError::UnexpectedEnd { additional: 2 },
(&[U64_BYTE, 0], DecodeError::UnexpectedEnd), ),
(&[U64_BYTE, 0, 0], DecodeError::UnexpectedEnd), (
(&[U64_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd), &[U32_BYTE, 0, 0, 0],
(&[U64_BYTE, 0, 0, 0, 0], DecodeError::UnexpectedEnd), DecodeError::UnexpectedEnd { additional: 1 },
(&[U64_BYTE, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd), ),
(&[U64_BYTE, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd), (&[U64_BYTE], DecodeError::UnexpectedEnd { additional: 8 }),
(&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd), (&[U64_BYTE, 0], DecodeError::UnexpectedEnd { additional: 7 }),
(&[U128_BYTE], DecodeError::UnexpectedEnd), (
(&[U128_BYTE, 0], DecodeError::UnexpectedEnd), &[U64_BYTE, 0, 0],
(&[U128_BYTE, 0, 0], DecodeError::UnexpectedEnd), DecodeError::UnexpectedEnd { additional: 6 },
(&[U128_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd), ),
(&[U128_BYTE, 0, 0, 0, 0], DecodeError::UnexpectedEnd), (
(&[U128_BYTE, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd), &[U64_BYTE, 0, 0, 0],
(&[U128_BYTE, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd), DecodeError::UnexpectedEnd { additional: 5 },
),
(
&[U64_BYTE, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 4 },
),
(
&[U64_BYTE, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 3 },
),
(
&[U64_BYTE, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 2 },
),
(
&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 1 },
),
(&[U128_BYTE], DecodeError::UnexpectedEnd { additional: 16 }),
(
&[U128_BYTE, 0],
DecodeError::UnexpectedEnd { additional: 15 },
),
(
&[U128_BYTE, 0, 0],
DecodeError::UnexpectedEnd { additional: 14 },
),
(
&[U128_BYTE, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 13 },
),
(
&[U128_BYTE, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 12 },
),
(
&[U128_BYTE, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 11 },
),
(
&[U128_BYTE, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 10 },
),
( (
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0], &[U128_BYTE, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd, DecodeError::UnexpectedEnd { additional: 9 },
), ),
( (
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0], &[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd, DecodeError::UnexpectedEnd { additional: 8 },
), ),
( (
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0], &[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd, DecodeError::UnexpectedEnd { additional: 7 },
), ),
( (
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], &[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd, DecodeError::UnexpectedEnd { additional: 6 },
), ),
( (
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], &[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd, DecodeError::UnexpectedEnd { additional: 5 },
), ),
( (
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], &[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd, DecodeError::UnexpectedEnd { additional: 4 },
), ),
( (
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], &[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd, DecodeError::UnexpectedEnd { additional: 3 },
), ),
( (
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], &[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd, DecodeError::UnexpectedEnd { additional: 2 },
),
(
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
DecodeError::UnexpectedEnd { additional: 1 },
), ),
]; ];