bip152: check if indexes do not overflow
This commit is contained in:
parent
014c4931be
commit
837f466f72
|
@ -158,7 +158,32 @@ pub struct HeaderAndShortIds {
|
||||||
/// which we expect a peer may be missing.
|
/// which we expect a peer may be missing.
|
||||||
pub prefilled_txs: Vec<PrefilledTransaction>,
|
pub prefilled_txs: Vec<PrefilledTransaction>,
|
||||||
}
|
}
|
||||||
impl_consensus_encoding!(HeaderAndShortIds, header, nonce, short_ids, prefilled_txs);
|
|
||||||
|
impl Decodable for HeaderAndShortIds {
|
||||||
|
fn consensus_decode<R: BufRead + ?Sized>(r: &mut R) -> Result<Self, encode::Error> {
|
||||||
|
let header_short_ids = HeaderAndShortIds {
|
||||||
|
header: Decodable::consensus_decode(r)?,
|
||||||
|
nonce: Decodable::consensus_decode(r)?,
|
||||||
|
short_ids: Decodable::consensus_decode(r)?,
|
||||||
|
prefilled_txs: Decodable::consensus_decode(r)?
|
||||||
|
};
|
||||||
|
match header_short_ids.short_ids.len().checked_add(header_short_ids.prefilled_txs.len()) {
|
||||||
|
Some(x) if x <= u16::MAX.into() => Ok(header_short_ids),
|
||||||
|
_ => Err(encode::Error::ParseFailed("indexes overflowed 16 bits")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Encodable for HeaderAndShortIds {
|
||||||
|
fn consensus_encode<W: Write + ?Sized>(&self, w: &mut W) -> Result<usize, io::Error> {
|
||||||
|
let mut len = 0;
|
||||||
|
len += self.header.consensus_encode(w)?;
|
||||||
|
len += self.nonce.consensus_encode(w)?;
|
||||||
|
len += self.short_ids.consensus_encode(w)?;
|
||||||
|
len += self.prefilled_txs.consensus_encode(w)?;
|
||||||
|
Ok(len)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl HeaderAndShortIds {
|
impl HeaderAndShortIds {
|
||||||
/// Creates a new [`HeaderAndShortIds`] from a full block.
|
/// Creates a new [`HeaderAndShortIds`] from a full block.
|
||||||
|
|
Loading…
Reference in New Issue