Skip to content

Commit

Permalink
Use LengthReadable for remaining read-to-end Readables
Browse files Browse the repository at this point in the history
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.

These remaining structs are largely the ones not covered when we transitioned
impl_writeable_msg to use LengthReadable in the previous commit.
  • Loading branch information
valentinewallace committed Mar 5, 2025
1 parent ce25c63 commit b95f2ce
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 b95f2ce

Please sign in to comment.