Add tests for excess bytes in SSZ

This commit is contained in:
Paul Hauner 2019-05-13 13:51:58 +10:00
parent 9ccaec5b91
commit 16a8cdb714
No known key found for this signature in database
GPG Key ID: D362883A9218FCC6
2 changed files with 42 additions and 2 deletions

View File

@ -101,7 +101,7 @@ impl<'a> SszDecoderBuilder<'a> {
Ok(()) Ok(())
} }
fn apply_offsets(&mut self) -> Result<(), DecodeError> { fn finalize(&mut self) -> Result<(), DecodeError> {
if !self.offsets.is_empty() { if !self.offsets.is_empty() {
// Check to ensure the first offset points to the byte immediately following the // Check to ensure the first offset points to the byte immediately following the
// fixed-length bytes. // fixed-length bytes.
@ -124,13 +124,21 @@ impl<'a> SszDecoderBuilder<'a> {
if let Some(last) = self.offsets.last() { if let Some(last) = self.offsets.last() {
self.items[last.position] = &self.bytes[last.offset..] self.items[last.position] = &self.bytes[last.offset..]
} }
} else {
// If the container is fixed-length, ensure there are no excess bytes.
if self.items_index != self.bytes.len() {
return Err(DecodeError::InvalidByteLength {
len: self.bytes.len(),
expected: self.items_index,
});
}
} }
Ok(()) Ok(())
} }
pub fn build(mut self) -> Result<SszDecoder<'a>, DecodeError> { pub fn build(mut self) -> Result<SszDecoder<'a>, DecodeError> {
self.apply_offsets()?; self.finalize()?;
Ok(SszDecoder { items: self.items }) Ok(SszDecoder { items: self.items })
} }

View File

@ -106,6 +106,22 @@ mod round_trip {
} }
} }
#[test]
fn fixed_len_excess_bytes() {
let fixed = FixedLen { a: 1, b: 2, c: 3 };
let mut bytes = fixed.as_ssz_bytes();
bytes.append(&mut vec![0]);
assert_eq!(
FixedLen::from_ssz_bytes(&bytes),
Err(DecodeError::InvalidByteLength {
len: 15,
expected: 14,
})
);
}
#[test] #[test]
fn vec_of_fixed_len_struct() { fn vec_of_fixed_len_struct() {
let items: Vec<FixedLen> = vec![ let items: Vec<FixedLen> = vec![
@ -138,6 +154,22 @@ mod round_trip {
); );
} }
#[test]
fn variable_len_excess_bytes() {
let variable = VariableLen {
a: 1,
b: vec![2],
c: 3,
};
let mut bytes = variable.as_ssz_bytes();
bytes.append(&mut vec![0]);
// The error message triggered is not so helpful, it's caught by a side-effect. Just
// checking there is _some_ error is fine.
assert!(VariableLen::from_ssz_bytes(&bytes).is_err());
}
#[test] #[test]
fn first_offset_skips_byte() { fn first_offset_skips_byte() {
let bytes = vec![ let bytes = vec![