mirror of
https://gitlab.com/pulsechaincom/lighthouse-pulse.git
synced 2024-12-25 13:07:18 +00:00
Add tests for excess bytes in SSZ
This commit is contained in:
parent
9ccaec5b91
commit
16a8cdb714
@ -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 })
|
||||||
}
|
}
|
||||||
|
@ -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![
|
||||||
|
Loading…
Reference in New Issue
Block a user