Skip to content

Commit

Permalink
Use LengthReadable for remaining read-to-end Readables
Browse files Browse the repository at this point in the history
See previous commits. When deserializing these structs, they will consume the
reader until it is out of bytes. Therefore, it's safer if they are only
provided with readers that limit how much of the byte stream will be read.
  • Loading branch information
valentinewallace committed Mar 4, 2025
1 parent 497f3a1 commit 792fcf0
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 18 deletions.
20 changes: 10 additions & 10 deletions lightning/src/ln/msgs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2094,8 +2094,8 @@ impl Writeable for AcceptChannel {
}
}

impl Readable for AcceptChannel {
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
impl LengthReadable for AcceptChannel {
fn read_from_fixed_length_buffer<'a, R: Read>(r: &mut FixedLengthReader<'a, R>) -> Result<Self, DecodeError> {
let temporary_channel_id: ChannelId = Readable::read(r)?;
let dust_limit_satoshis: u64 = Readable::read(r)?;
let max_htlc_value_in_flight_msat: u64 = Readable::read(r)?;
Expand Down Expand Up @@ -2179,8 +2179,8 @@ impl Writeable for AcceptChannelV2 {
}
}

impl Readable for AcceptChannelV2 {
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
impl LengthReadable for AcceptChannelV2 {
fn read_from_fixed_length_buffer<'a, R: Read>(r: &mut FixedLengthReader<'a, R>) -> Result<Self, DecodeError> {
let temporary_channel_id: ChannelId = Readable::read(r)?;
let funding_satoshis: u64 = Readable::read(r)?;
let dust_limit_satoshis: u64 = Readable::read(r)?;
Expand Down Expand Up @@ -2442,8 +2442,8 @@ impl Writeable for Init {
}
}

impl Readable for Init {
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
impl LengthReadable for Init {
fn read_from_fixed_length_buffer<'a, R: Read>(r: &mut FixedLengthReader<'a, R>) -> Result<Self, DecodeError> {
let global_features: InitFeatures = Readable::read(r)?;
let features: InitFeatures = Readable::read(r)?;
let mut remote_network_address: Option<SocketAddress> = None;
Expand Down Expand Up @@ -2488,8 +2488,8 @@ impl Writeable for OpenChannel {
}
}

impl Readable for OpenChannel {
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
impl LengthReadable for OpenChannel {
fn read_from_fixed_length_buffer<'a, R: Read>(r: &mut FixedLengthReader<'a, R>) -> Result<Self, DecodeError> {
let chain_hash: ChainHash = Readable::read(r)?;
let temporary_channel_id: ChannelId = Readable::read(r)?;
let funding_satoshis: u64 = Readable::read(r)?;
Expand Down Expand Up @@ -2572,8 +2572,8 @@ impl Writeable for OpenChannelV2 {
}
}

impl Readable for OpenChannelV2 {
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
impl LengthReadable for OpenChannelV2 {
fn read_from_fixed_length_buffer<'a, R: Read>(r: &mut FixedLengthReader<'a, R>) -> Result<Self, DecodeError> {
let chain_hash: ChainHash = Readable::read(r)?;
let temporary_channel_id: ChannelId = Readable::read(r)?;
let funding_feerate_sat_per_1000_weight: u32 = Readable::read(r)?;
Expand Down
20 changes: 15 additions & 5 deletions lightning/src/ln/wire.rs
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,9 @@ where
H::Target: CustomMessageReader<CustomMessage = T>,
{
match message_type {
msgs::Init::TYPE => Ok(Message::Init(Readable::read(buffer)?)),
msgs::Init::TYPE => {
Ok(Message::Init(LengthReadable::read_from_fixed_length_buffer(buffer)?))
},
msgs::ErrorMessage::TYPE => Ok(Message::Error(Readable::read(buffer)?)),
msgs::WarningMessage::TYPE => Ok(Message::Warning(Readable::read(buffer)?)),
msgs::Ping::TYPE => Ok(Message::Ping(Readable::read(buffer)?)),
Expand All @@ -268,10 +270,18 @@ where
msgs::PeerStorageRetrieval::TYPE => Ok(Message::PeerStorageRetrieval(
LengthReadable::read_from_fixed_length_buffer(buffer)?,
)),
msgs::OpenChannel::TYPE => Ok(Message::OpenChannel(Readable::read(buffer)?)),
msgs::OpenChannelV2::TYPE => Ok(Message::OpenChannelV2(Readable::read(buffer)?)),
msgs::AcceptChannel::TYPE => Ok(Message::AcceptChannel(Readable::read(buffer)?)),
msgs::AcceptChannelV2::TYPE => Ok(Message::AcceptChannelV2(Readable::read(buffer)?)),
msgs::OpenChannel::TYPE => {
Ok(Message::OpenChannel(LengthReadable::read_from_fixed_length_buffer(buffer)?))
},
msgs::OpenChannelV2::TYPE => {
Ok(Message::OpenChannelV2(LengthReadable::read_from_fixed_length_buffer(buffer)?))
},
msgs::AcceptChannel::TYPE => {
Ok(Message::AcceptChannel(LengthReadable::read_from_fixed_length_buffer(buffer)?))
},
msgs::AcceptChannelV2::TYPE => {
Ok(Message::AcceptChannelV2(LengthReadable::read_from_fixed_length_buffer(buffer)?))
},
msgs::FundingCreated::TYPE => {
Ok(Message::FundingCreated(LengthReadable::read_from_fixed_length_buffer(buffer)?))
},
Expand Down
9 changes: 6 additions & 3 deletions lightning/src/offers/offer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ use crate::offers::parse::{Bech32Encode, Bolt12ParseError, Bolt12SemanticError,
use crate::offers::signer::{self, Metadata, MetadataMaterial};
use crate::types::features::OfferFeatures;
use crate::util::ser::{
CursorReadable, HighZeroBytesDroppedBigSize, Readable, WithoutLength, Writeable, Writer,
CursorReadable, FixedLengthReader, HighZeroBytesDroppedBigSize, LengthReadable, Readable,
WithoutLength, Writeable, Writer,
};
use crate::util::string::PrintableString;
use bitcoin::constants::ChainHash;
Expand Down Expand Up @@ -1033,8 +1034,10 @@ impl OfferContents {
}
}

impl Readable for Offer {
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
impl LengthReadable for Offer {
fn read_from_fixed_length_buffer<'a, R: io::Read>(
reader: &mut FixedLengthReader<'a, R>,
) -> Result<Self, DecodeError> {
let bytes: WithoutLength<Vec<u8>> = Readable::read(reader)?;
Self::try_from(bytes.0).map_err(|_| DecodeError::InvalidValue)
}
Expand Down

0 comments on commit 792fcf0

Please sign in to comment.