Skip to content

Commit 650fa39

Browse files
Added additional to the UnexpectedEnd decode error (#522)
1 parent dadf335 commit 650fa39

File tree

4 files changed

+147
-56
lines changed

4 files changed

+147
-56
lines changed

src/de/read.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ impl<'storage> Reader for SliceReader<'storage> {
7575
#[inline(always)]
7676
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
7777
if bytes.len() > self.slice.len() {
78-
return Err(DecodeError::UnexpectedEnd);
78+
return Err(DecodeError::UnexpectedEnd {
79+
additional: bytes.len() - self.slice.len(),
80+
});
7981
}
8082
let (read_slice, remaining) = self.slice.split_at(bytes.len());
8183
bytes.copy_from_slice(read_slice);
@@ -99,7 +101,9 @@ impl<'storage> BorrowReader<'storage> for SliceReader<'storage> {
99101
#[inline(always)]
100102
fn take_bytes(&mut self, length: usize) -> Result<&'storage [u8], DecodeError> {
101103
if length > self.slice.len() {
102-
return Err(DecodeError::UnexpectedEnd);
104+
return Err(DecodeError::UnexpectedEnd {
105+
additional: length - self.slice.len(),
106+
});
103107
}
104108
let (read_slice, remaining) = self.slice.split_at(length);
105109
self.slice = remaining;

src/error.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,14 @@ impl core::fmt::Display for EncodeError {
6868
#[derive(Debug, PartialEq)]
6969
pub enum DecodeError {
7070
/// The reader reached its end but more bytes were expected.
71-
UnexpectedEnd,
71+
UnexpectedEnd {
72+
/// Gives an estimate of how many extra bytes are needed.
73+
///
74+
/// **Note**: this is only an estimate and not indicative of the actual bytes needed.
75+
///
76+
/// **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.
77+
additional: usize,
78+
},
7279

7380
/// The given configuration limit was exceeded
7481
LimitExceeded,

src/features/impl_std.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ where
4949
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
5050
match self.reader.read_exact(bytes) {
5151
Ok(_) => Ok(()),
52-
Err(_) => Err(DecodeError::UnexpectedEnd),
52+
Err(_) => Err(DecodeError::UnexpectedEnd {
53+
additional: bytes.len(),
54+
}),
5355
}
5456
}
5557
}
@@ -61,7 +63,9 @@ where
6163
fn read(&mut self, bytes: &mut [u8]) -> Result<(), DecodeError> {
6264
match self.read_exact(bytes) {
6365
Ok(_) => Ok(()),
64-
Err(_) => Err(DecodeError::UnexpectedEnd),
66+
Err(_) => Err(DecodeError::UnexpectedEnd {
67+
additional: bytes.len(),
68+
}),
6569
}
6670
}
6771

src/varint/decode_unsigned.rs

+127-51
Original file line numberDiff line numberDiff line change
@@ -422,8 +422,8 @@ fn test_decode_u16() {
422422
found: IntegerType::U128,
423423
},
424424
),
425-
(&[U16_BYTE], DecodeError::UnexpectedEnd),
426-
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd),
425+
(&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
426+
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
427427
];
428428

429429
for (slice, expected) in errors {
@@ -466,12 +466,18 @@ fn test_decode_u32() {
466466
found: IntegerType::U128,
467467
},
468468
),
469-
(&[U16_BYTE], DecodeError::UnexpectedEnd),
470-
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd),
471-
(&[U32_BYTE], DecodeError::UnexpectedEnd),
472-
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd),
473-
(&[U32_BYTE, 0, 0], DecodeError::UnexpectedEnd),
474-
(&[U32_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
469+
(&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
470+
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
471+
(&[U32_BYTE], DecodeError::UnexpectedEnd { additional: 4 }),
472+
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd { additional: 3 }),
473+
(
474+
&[U32_BYTE, 0, 0],
475+
DecodeError::UnexpectedEnd { additional: 2 },
476+
),
477+
(
478+
&[U32_BYTE, 0, 0, 0],
479+
DecodeError::UnexpectedEnd { additional: 1 },
480+
),
475481
];
476482

477483
for (slice, expected) in errors {
@@ -512,20 +518,44 @@ fn test_decode_u64() {
512518
found: IntegerType::U128,
513519
},
514520
),
515-
(&[U16_BYTE], DecodeError::UnexpectedEnd),
516-
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd),
517-
(&[U32_BYTE], DecodeError::UnexpectedEnd),
518-
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd),
519-
(&[U32_BYTE, 0, 0], DecodeError::UnexpectedEnd),
520-
(&[U32_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
521-
(&[U64_BYTE], DecodeError::UnexpectedEnd),
522-
(&[U64_BYTE, 0], DecodeError::UnexpectedEnd),
523-
(&[U64_BYTE, 0, 0], DecodeError::UnexpectedEnd),
524-
(&[U64_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
525-
(&[U64_BYTE, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
526-
(&[U64_BYTE, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
527-
(&[U64_BYTE, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
528-
(&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
521+
(&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
522+
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
523+
(&[U32_BYTE], DecodeError::UnexpectedEnd { additional: 4 }),
524+
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd { additional: 3 }),
525+
(
526+
&[U32_BYTE, 0, 0],
527+
DecodeError::UnexpectedEnd { additional: 2 },
528+
),
529+
(
530+
&[U32_BYTE, 0, 0, 0],
531+
DecodeError::UnexpectedEnd { additional: 1 },
532+
),
533+
(&[U64_BYTE], DecodeError::UnexpectedEnd { additional: 8 }),
534+
(&[U64_BYTE, 0], DecodeError::UnexpectedEnd { additional: 7 }),
535+
(
536+
&[U64_BYTE, 0, 0],
537+
DecodeError::UnexpectedEnd { additional: 6 },
538+
),
539+
(
540+
&[U64_BYTE, 0, 0, 0],
541+
DecodeError::UnexpectedEnd { additional: 5 },
542+
),
543+
(
544+
&[U64_BYTE, 0, 0, 0, 0],
545+
DecodeError::UnexpectedEnd { additional: 4 },
546+
),
547+
(
548+
&[U64_BYTE, 0, 0, 0, 0, 0],
549+
DecodeError::UnexpectedEnd { additional: 3 },
550+
),
551+
(
552+
&[U64_BYTE, 0, 0, 0, 0, 0, 0],
553+
DecodeError::UnexpectedEnd { additional: 2 },
554+
),
555+
(
556+
&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0],
557+
DecodeError::UnexpectedEnd { additional: 1 },
558+
),
529559
];
530560

531561
for (slice, expected) in errors {
@@ -564,58 +594,104 @@ fn test_decode_u128() {
564594
}
565595

566596
let errors: &[(&[u8], DecodeError)] = &[
567-
(&[U16_BYTE], DecodeError::UnexpectedEnd),
568-
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd),
569-
(&[U32_BYTE], DecodeError::UnexpectedEnd),
570-
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd),
571-
(&[U32_BYTE, 0, 0], DecodeError::UnexpectedEnd),
572-
(&[U32_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
573-
(&[U64_BYTE], DecodeError::UnexpectedEnd),
574-
(&[U64_BYTE, 0], DecodeError::UnexpectedEnd),
575-
(&[U64_BYTE, 0, 0], DecodeError::UnexpectedEnd),
576-
(&[U64_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
577-
(&[U64_BYTE, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
578-
(&[U64_BYTE, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
579-
(&[U64_BYTE, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
580-
(&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
581-
(&[U128_BYTE], DecodeError::UnexpectedEnd),
582-
(&[U128_BYTE, 0], DecodeError::UnexpectedEnd),
583-
(&[U128_BYTE, 0, 0], DecodeError::UnexpectedEnd),
584-
(&[U128_BYTE, 0, 0, 0], DecodeError::UnexpectedEnd),
585-
(&[U128_BYTE, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
586-
(&[U128_BYTE, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
587-
(&[U128_BYTE, 0, 0, 0, 0, 0, 0], DecodeError::UnexpectedEnd),
597+
(&[U16_BYTE], DecodeError::UnexpectedEnd { additional: 2 }),
598+
(&[U16_BYTE, 0], DecodeError::UnexpectedEnd { additional: 1 }),
599+
(&[U32_BYTE], DecodeError::UnexpectedEnd { additional: 4 }),
600+
(&[U32_BYTE, 0], DecodeError::UnexpectedEnd { additional: 3 }),
601+
(
602+
&[U32_BYTE, 0, 0],
603+
DecodeError::UnexpectedEnd { additional: 2 },
604+
),
605+
(
606+
&[U32_BYTE, 0, 0, 0],
607+
DecodeError::UnexpectedEnd { additional: 1 },
608+
),
609+
(&[U64_BYTE], DecodeError::UnexpectedEnd { additional: 8 }),
610+
(&[U64_BYTE, 0], DecodeError::UnexpectedEnd { additional: 7 }),
611+
(
612+
&[U64_BYTE, 0, 0],
613+
DecodeError::UnexpectedEnd { additional: 6 },
614+
),
615+
(
616+
&[U64_BYTE, 0, 0, 0],
617+
DecodeError::UnexpectedEnd { additional: 5 },
618+
),
619+
(
620+
&[U64_BYTE, 0, 0, 0, 0],
621+
DecodeError::UnexpectedEnd { additional: 4 },
622+
),
623+
(
624+
&[U64_BYTE, 0, 0, 0, 0, 0],
625+
DecodeError::UnexpectedEnd { additional: 3 },
626+
),
627+
(
628+
&[U64_BYTE, 0, 0, 0, 0, 0, 0],
629+
DecodeError::UnexpectedEnd { additional: 2 },
630+
),
631+
(
632+
&[U64_BYTE, 0, 0, 0, 0, 0, 0, 0],
633+
DecodeError::UnexpectedEnd { additional: 1 },
634+
),
635+
(&[U128_BYTE], DecodeError::UnexpectedEnd { additional: 16 }),
636+
(
637+
&[U128_BYTE, 0],
638+
DecodeError::UnexpectedEnd { additional: 15 },
639+
),
640+
(
641+
&[U128_BYTE, 0, 0],
642+
DecodeError::UnexpectedEnd { additional: 14 },
643+
),
644+
(
645+
&[U128_BYTE, 0, 0, 0],
646+
DecodeError::UnexpectedEnd { additional: 13 },
647+
),
648+
(
649+
&[U128_BYTE, 0, 0, 0, 0],
650+
DecodeError::UnexpectedEnd { additional: 12 },
651+
),
652+
(
653+
&[U128_BYTE, 0, 0, 0, 0, 0],
654+
DecodeError::UnexpectedEnd { additional: 11 },
655+
),
656+
(
657+
&[U128_BYTE, 0, 0, 0, 0, 0, 0],
658+
DecodeError::UnexpectedEnd { additional: 10 },
659+
),
588660
(
589661
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0],
590-
DecodeError::UnexpectedEnd,
662+
DecodeError::UnexpectedEnd { additional: 9 },
591663
),
592664
(
593665
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0],
594-
DecodeError::UnexpectedEnd,
666+
DecodeError::UnexpectedEnd { additional: 8 },
595667
),
596668
(
597669
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0],
598-
DecodeError::UnexpectedEnd,
670+
DecodeError::UnexpectedEnd { additional: 7 },
599671
),
600672
(
601673
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
602-
DecodeError::UnexpectedEnd,
674+
DecodeError::UnexpectedEnd { additional: 6 },
603675
),
604676
(
605677
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
606-
DecodeError::UnexpectedEnd,
678+
DecodeError::UnexpectedEnd { additional: 5 },
607679
),
608680
(
609681
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
610-
DecodeError::UnexpectedEnd,
682+
DecodeError::UnexpectedEnd { additional: 4 },
611683
),
612684
(
613685
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
614-
DecodeError::UnexpectedEnd,
686+
DecodeError::UnexpectedEnd { additional: 3 },
615687
),
616688
(
617689
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
618-
DecodeError::UnexpectedEnd,
690+
DecodeError::UnexpectedEnd { additional: 2 },
691+
),
692+
(
693+
&[U128_BYTE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
694+
DecodeError::UnexpectedEnd { additional: 1 },
619695
),
620696
];
621697

0 commit comments

Comments
 (0)