Disallow extra bytes in Bitfield from_bytes (#488)
This commit is contained in:
parent
4f45bf2255
commit
0374e31907
@ -161,6 +161,7 @@ impl<N: Unsigned + Clone> Bitfield<Variable<N>> {
|
|||||||
///
|
///
|
||||||
/// Returns `None` if `bytes` are not a valid encoding.
|
/// Returns `None` if `bytes` are not a valid encoding.
|
||||||
pub fn from_bytes(bytes: Vec<u8>) -> Result<Self, Error> {
|
pub fn from_bytes(bytes: Vec<u8>) -> Result<Self, Error> {
|
||||||
|
let bytes_len = bytes.len();
|
||||||
let mut initial_bitfield: Bitfield<Variable<N>> = {
|
let mut initial_bitfield: Bitfield<Variable<N>> = {
|
||||||
let num_bits = bytes.len() * 8;
|
let num_bits = bytes.len() * 8;
|
||||||
Bitfield::from_raw_bytes(bytes, num_bits)?
|
Bitfield::from_raw_bytes(bytes, num_bits)?
|
||||||
@ -170,6 +171,14 @@ impl<N: Unsigned + Clone> Bitfield<Variable<N>> {
|
|||||||
.highest_set_bit()
|
.highest_set_bit()
|
||||||
.ok_or_else(|| Error::MissingLengthInformation)?;
|
.ok_or_else(|| Error::MissingLengthInformation)?;
|
||||||
|
|
||||||
|
// The length bit should be in the last byte, or else it means we have too many bytes.
|
||||||
|
if len / 8 + 1 != bytes_len {
|
||||||
|
return Err(Error::InvalidByteCount {
|
||||||
|
given: bytes_len,
|
||||||
|
expected: len / 8 + 1,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if len <= Self::max_len() {
|
if len <= Self::max_len() {
|
||||||
initial_bitfield
|
initial_bitfield
|
||||||
.set(len, false)
|
.set(len, false)
|
||||||
@ -825,6 +834,17 @@ mod bitlist {
|
|||||||
assert!(BitList8::from_ssz_bytes(&[0b0000_0001, 0b0000_0100]).is_err());
|
assert!(BitList8::from_ssz_bytes(&[0b0000_0001, 0b0000_0100]).is_err());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ssz_decode_extra_bytes() {
|
||||||
|
assert!(BitList0::from_ssz_bytes(&[0b0000_0001, 0b0000_0000]).is_err());
|
||||||
|
assert!(BitList1::from_ssz_bytes(&[0b0000_0001, 0b0000_0000]).is_err());
|
||||||
|
assert!(BitList8::from_ssz_bytes(&[0b0000_0001, 0b0000_0000]).is_err());
|
||||||
|
assert!(BitList16::from_ssz_bytes(&[0b0000_0001, 0b0000_0000]).is_err());
|
||||||
|
assert!(BitList1024::from_ssz_bytes(&[0b1000_0000, 0]).is_err());
|
||||||
|
assert!(BitList1024::from_ssz_bytes(&[0b1000_0000, 0, 0]).is_err());
|
||||||
|
assert!(BitList1024::from_ssz_bytes(&[0b1000_0000, 0, 0, 0, 0]).is_err());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ssz_round_trip() {
|
fn ssz_round_trip() {
|
||||||
assert_round_trip(BitList0::with_capacity(0).unwrap());
|
assert_round_trip(BitList0::with_capacity(0).unwrap());
|
||||||
|
Loading…
Reference in New Issue
Block a user