diff --git a/crates/ssz-derive/src/lib.rs b/crates/ssz-derive/src/lib.rs index b4d873a..c8a1dbd 100644 --- a/crates/ssz-derive/src/lib.rs +++ b/crates/ssz-derive/src/lib.rs @@ -582,12 +582,7 @@ fn derive_decode_struct( } Ok(result) } else { - // Variable-size: fall back to default - let item_size = ::fixed_size(); - bytes - .chunks_exact(item_size) - .map(Self::from_ssz_bytes) - .collect() + Err(libssz::DecodeError::NotFixedSize) } } } diff --git a/crates/ssz/src/decode.rs b/crates/ssz/src/decode.rs index 6986f4d..698f517 100644 --- a/crates/ssz/src/decode.rs +++ b/crates/ssz/src/decode.rs @@ -22,6 +22,9 @@ pub trait SszDecode: Sized { #[cfg(feature = "alloc")] fn ssz_decode_fixed_vec(bytes: &[u8]) -> Result, DecodeError> { let item_size = Self::fixed_size(); + if item_size == 0 { + return Err(DecodeError::NotFixedSize); + } bytes .chunks_exact(item_size) .map(Self::from_ssz_bytes) diff --git a/crates/ssz/src/error.rs b/crates/ssz/src/error.rs index 1482848..9c9420f 100644 --- a/crates/ssz/src/error.rs +++ b/crates/ssz/src/error.rs @@ -24,6 +24,8 @@ pub enum DecodeError { MissingDelimiterBit, /// A container has zero variable-length fields but leftover bytes. AdditionalBytes { expected: usize, got: usize }, + /// `ssz_decode_fixed_vec` was called on a variable-size type. + NotFixedSize, } #[cfg(feature = "std")]