Skip to content

Commit 47916c1

Browse files
Use LengthReadable for remaining read-to-end Readables
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.
1 parent d140b78 commit 47916c1

File tree

3 files changed

+31
-18
lines changed

3 files changed

+31
-18
lines changed

lightning/src/ln/msgs.rs

+10-10
Original file line numberDiff line numberDiff line change
@@ -2094,8 +2094,8 @@ impl Writeable for AcceptChannel {
20942094
}
20952095
}
20962096

2097-
impl Readable for AcceptChannel {
2098-
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
2097+
impl LengthReadable for AcceptChannel {
2098+
fn read_from_fixed_length_buffer<'a, R: Read>(r: &mut FixedLengthReader<'a, R>) -> Result<Self, DecodeError> {
20992099
let temporary_channel_id: ChannelId = Readable::read(r)?;
21002100
let dust_limit_satoshis: u64 = Readable::read(r)?;
21012101
let max_htlc_value_in_flight_msat: u64 = Readable::read(r)?;
@@ -2179,8 +2179,8 @@ impl Writeable for AcceptChannelV2 {
21792179
}
21802180
}
21812181

2182-
impl Readable for AcceptChannelV2 {
2183-
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
2182+
impl LengthReadable for AcceptChannelV2 {
2183+
fn read_from_fixed_length_buffer<'a, R: Read>(r: &mut FixedLengthReader<'a, R>) -> Result<Self, DecodeError> {
21842184
let temporary_channel_id: ChannelId = Readable::read(r)?;
21852185
let funding_satoshis: u64 = Readable::read(r)?;
21862186
let dust_limit_satoshis: u64 = Readable::read(r)?;
@@ -2442,8 +2442,8 @@ impl Writeable for Init {
24422442
}
24432443
}
24442444

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

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

2575-
impl Readable for OpenChannelV2 {
2576-
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
2575+
impl LengthReadable for OpenChannelV2 {
2576+
fn read_from_fixed_length_buffer<'a, R: Read>(r: &mut FixedLengthReader<'a, R>) -> Result<Self, DecodeError> {
25772577
let chain_hash: ChainHash = Readable::read(r)?;
25782578
let temporary_channel_id: ChannelId = Readable::read(r)?;
25792579
let funding_feerate_sat_per_1000_weight: u32 = Readable::read(r)?;

lightning/src/ln/wire.rs

+15-5
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,9 @@ where
257257
H::Target: CustomMessageReader<CustomMessage = T>,
258258
{
259259
match message_type {
260-
msgs::Init::TYPE => Ok(Message::Init(Readable::read(buffer)?)),
260+
msgs::Init::TYPE => {
261+
Ok(Message::Init(LengthReadable::read_from_fixed_length_buffer(buffer)?))
262+
},
261263
msgs::ErrorMessage::TYPE => Ok(Message::Error(Readable::read(buffer)?)),
262264
msgs::WarningMessage::TYPE => Ok(Message::Warning(Readable::read(buffer)?)),
263265
msgs::Ping::TYPE => Ok(Message::Ping(Readable::read(buffer)?)),
@@ -268,10 +270,18 @@ where
268270
msgs::PeerStorageRetrieval::TYPE => Ok(Message::PeerStorageRetrieval(
269271
LengthReadable::read_from_fixed_length_buffer(buffer)?,
270272
)),
271-
msgs::OpenChannel::TYPE => Ok(Message::OpenChannel(Readable::read(buffer)?)),
272-
msgs::OpenChannelV2::TYPE => Ok(Message::OpenChannelV2(Readable::read(buffer)?)),
273-
msgs::AcceptChannel::TYPE => Ok(Message::AcceptChannel(Readable::read(buffer)?)),
274-
msgs::AcceptChannelV2::TYPE => Ok(Message::AcceptChannelV2(Readable::read(buffer)?)),
273+
msgs::OpenChannel::TYPE => {
274+
Ok(Message::OpenChannel(LengthReadable::read_from_fixed_length_buffer(buffer)?))
275+
},
276+
msgs::OpenChannelV2::TYPE => {
277+
Ok(Message::OpenChannelV2(LengthReadable::read_from_fixed_length_buffer(buffer)?))
278+
},
279+
msgs::AcceptChannel::TYPE => {
280+
Ok(Message::AcceptChannel(LengthReadable::read_from_fixed_length_buffer(buffer)?))
281+
},
282+
msgs::AcceptChannelV2::TYPE => {
283+
Ok(Message::AcceptChannelV2(LengthReadable::read_from_fixed_length_buffer(buffer)?))
284+
},
275285
msgs::FundingCreated::TYPE => {
276286
Ok(Message::FundingCreated(LengthReadable::read_from_fixed_length_buffer(buffer)?))
277287
},

lightning/src/offers/offer.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ use crate::offers::parse::{Bech32Encode, Bolt12ParseError, Bolt12SemanticError,
8888
use crate::offers::signer::{self, Metadata, MetadataMaterial};
8989
use crate::types::features::OfferFeatures;
9090
use crate::util::ser::{
91-
CursorReadable, HighZeroBytesDroppedBigSize, Readable, WithoutLength, Writeable, Writer,
91+
CursorReadable, FixedLengthReader, HighZeroBytesDroppedBigSize, LengthReadable, Readable,
92+
WithoutLength, Writeable, Writer,
9293
};
9394
use crate::util::string::PrintableString;
9495
use bitcoin::constants::ChainHash;
@@ -1033,8 +1034,10 @@ impl OfferContents {
10331034
}
10341035
}
10351036

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

0 commit comments

Comments
 (0)