Skip to content

Commit 94f8952

Browse files
Require length limiting reader for offers messages
Continuing the work over the past few commits, we want to transition any structs that always consume the entire provided reader when being deserialized to require a length-limiting reader. To do this we actually require all the offers' underlying ser wrappers to be read from a length-limiting reader as well, since these wrappers will always read-to-end in general. Some of the ser macros needed updating for this, which is fine because all TLV values were already read from a length-limiting reader.
1 parent 7e5c80f commit 94f8952

File tree

6 files changed

+42
-30
lines changed

6 files changed

+42
-30
lines changed

lightning/src/offers/invoice.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ use crate::offers::signer::{self, Metadata};
148148
use crate::types::features::{Bolt12InvoiceFeatures, InvoiceRequestFeatures, OfferFeatures};
149149
use crate::types::payment::PaymentHash;
150150
use crate::util::ser::{
151-
CursorReadable, HighZeroBytesDroppedBigSize, Iterable, Readable, WithoutLength, Writeable,
152-
Writer,
151+
CursorReadable, HighZeroBytesDroppedBigSize, Iterable, LengthLimitedRead, LengthReadable,
152+
WithoutLength, Writeable, Writer,
153153
};
154154
use crate::util::string::PrintableString;
155155
use bitcoin::address::Address;
@@ -1398,9 +1398,11 @@ impl Writeable for Bolt12Invoice {
13981398
}
13991399
}
14001400

1401-
impl Readable for Bolt12Invoice {
1402-
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
1403-
let bytes: WithoutLength<Vec<u8>> = Readable::read(reader)?;
1401+
impl LengthReadable for Bolt12Invoice {
1402+
fn read_from_fixed_length_buffer<R: LengthLimitedRead>(
1403+
reader: &mut R,
1404+
) -> Result<Self, DecodeError> {
1405+
let bytes: WithoutLength<Vec<u8>> = LengthReadable::read_from_fixed_length_buffer(reader)?;
14041406
Self::try_from(bytes.0).map_err(|_| DecodeError::InvalidValue)
14051407
}
14061408
}

lightning/src/offers/invoice_request.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ use crate::onion_message::dns_resolution::HumanReadableName;
8686
use crate::types::features::InvoiceRequestFeatures;
8787
use crate::types::payment::PaymentHash;
8888
use crate::util::ser::{
89-
CursorReadable, HighZeroBytesDroppedBigSize, Readable, WithoutLength, Writeable, Writer,
89+
CursorReadable, HighZeroBytesDroppedBigSize, LengthLimitedRead, LengthReadable, Readable,
90+
WithoutLength, Writeable, Writer,
9091
};
9192
use crate::util::string::{PrintableString, UntrustedString};
9293
use bitcoin::constants::ChainHash;
@@ -1119,9 +1120,9 @@ impl Writeable for InvoiceRequestContents {
11191120
}
11201121
}
11211122

1122-
impl Readable for InvoiceRequest {
1123-
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
1124-
let bytes: WithoutLength<Vec<u8>> = Readable::read(reader)?;
1123+
impl LengthReadable for InvoiceRequest {
1124+
fn read_from_fixed_length_buffer<R: LengthLimitedRead>(r: &mut R) -> Result<Self, DecodeError> {
1125+
let bytes: WithoutLength<Vec<u8>> = LengthReadable::read_from_fixed_length_buffer(r)?;
11251126
Self::try_from(bytes.0).map_err(|_| DecodeError::InvalidValue)
11261127
}
11271128
}

lightning/src/offers/offer.rs

+7-4
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, HighZeroBytesDroppedBigSize, LengthLimitedRead, LengthReadable, Readable,
92+
WithoutLength, Writeable, Writer,
9293
};
9394
use crate::util::string::PrintableString;
9495
use bitcoin::constants::ChainHash;
@@ -1033,9 +1034,11 @@ impl OfferContents {
10331034
}
10341035
}
10351036

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

lightning/src/offers/refund.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ use crate::offers::signer::{self, Metadata, MetadataMaterial};
102102
use crate::sign::EntropySource;
103103
use crate::types::features::InvoiceRequestFeatures;
104104
use crate::types::payment::PaymentHash;
105-
use crate::util::ser::{CursorReadable, Readable, WithoutLength, Writeable, Writer};
105+
use crate::util::ser::{
106+
CursorReadable, LengthLimitedRead, LengthReadable, WithoutLength, Writeable, Writer,
107+
};
106108
use crate::util::string::PrintableString;
107109
use bitcoin::constants::ChainHash;
108110
use bitcoin::network::Network;
@@ -822,9 +824,11 @@ impl RefundContents {
822824
}
823825
}
824826

825-
impl Readable for Refund {
826-
fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
827-
let bytes: WithoutLength<Vec<u8>> = Readable::read(reader)?;
827+
impl LengthReadable for Refund {
828+
fn read_from_fixed_length_buffer<R: LengthLimitedRead>(
829+
reader: &mut R,
830+
) -> Result<Self, DecodeError> {
831+
let bytes: WithoutLength<Vec<u8>> = LengthReadable::read_from_fixed_length_buffer(reader)?;
828832
Self::try_from(bytes.0).map_err(|_| DecodeError::InvalidValue)
829833
}
830834
}

lightning/src/util/ser.rs

+13-11
Original file line numberDiff line numberDiff line change
@@ -740,10 +740,10 @@ impl Writeable for WithoutLength<&String> {
740740
w.write_all(self.0.as_bytes())
741741
}
742742
}
743-
impl Readable for WithoutLength<String> {
743+
impl LengthReadable for WithoutLength<String> {
744744
#[inline]
745-
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
746-
let v: WithoutLength<Vec<u8>> = Readable::read(r)?;
745+
fn read_from_fixed_length_buffer<R: LengthLimitedRead>(r: &mut R) -> Result<Self, DecodeError> {
746+
let v: WithoutLength<Vec<u8>> = LengthReadable::read_from_fixed_length_buffer(r)?;
747747
Ok(Self(String::from_utf8(v.0).map_err(|_| DecodeError::InvalidValue)?))
748748
}
749749
}
@@ -772,10 +772,10 @@ impl Writeable for WithoutLength<&UntrustedString> {
772772
WithoutLength(&self.0 .0).write(w)
773773
}
774774
}
775-
impl Readable for WithoutLength<UntrustedString> {
775+
impl LengthReadable for WithoutLength<UntrustedString> {
776776
#[inline]
777-
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
778-
let s: WithoutLength<String> = Readable::read(r)?;
777+
fn read_from_fixed_length_buffer<R: LengthLimitedRead>(r: &mut R) -> Result<Self, DecodeError> {
778+
let s: WithoutLength<String> = LengthReadable::read_from_fixed_length_buffer(r)?;
779779
Ok(Self(UntrustedString(s.0)))
780780
}
781781
}
@@ -808,9 +808,11 @@ impl<S: AsWriteableSlice> Writeable for WithoutLength<S> {
808808
}
809809
}
810810

811-
impl<T: MaybeReadable> Readable for WithoutLength<Vec<T>> {
811+
impl<T: MaybeReadable> LengthReadable for WithoutLength<Vec<T>> {
812812
#[inline]
813-
fn read<R: Read>(reader: &mut R) -> Result<Self, DecodeError> {
813+
fn read_from_fixed_length_buffer<R: LengthLimitedRead>(
814+
reader: &mut R,
815+
) -> Result<Self, DecodeError> {
814816
let mut values = Vec::new();
815817
loop {
816818
let mut track_read = ReadTrackingReader::new(reader);
@@ -841,10 +843,10 @@ impl Writeable for WithoutLength<&ScriptBuf> {
841843
}
842844
}
843845

844-
impl Readable for WithoutLength<ScriptBuf> {
846+
impl LengthReadable for WithoutLength<ScriptBuf> {
845847
#[inline]
846-
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
847-
let v: WithoutLength<Vec<u8>> = Readable::read(r)?;
848+
fn read_from_fixed_length_buffer<R: LengthLimitedRead>(r: &mut R) -> Result<Self, DecodeError> {
849+
let v: WithoutLength<Vec<u8>> = LengthReadable::read_from_fixed_length_buffer(r)?;
848850
Ok(WithoutLength(script::Builder::from(v.0).into_script()))
849851
}
850852
}

lightning/src/util/ser_macros.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ macro_rules! _decode_tlv {
409409
$field = $trait::read(&mut $reader $(, $read_arg)*)?;
410410
}};
411411
($outer_reader: expr, $reader: expr, $field: ident, required_vec) => {{
412-
let f: $crate::util::ser::WithoutLength<Vec<_>> = $crate::util::ser::Readable::read(&mut $reader)?;
412+
let f: $crate::util::ser::WithoutLength<Vec<_>> = $crate::util::ser::LengthReadable::read_from_fixed_length_buffer(&mut $reader)?;
413413
$field = f.0;
414414
}};
415415
($outer_reader: expr, $reader: expr, $field: ident, option) => {{
@@ -427,7 +427,7 @@ macro_rules! _decode_tlv {
427427
_decode_tlv!($outer_reader, $reader, $field, required);
428428
}};
429429
($outer_reader: expr, $reader: expr, $field: ident, optional_vec) => {{
430-
let f: $crate::util::ser::WithoutLength<Vec<_>> = $crate::util::ser::Readable::read(&mut $reader)?;
430+
let f: $crate::util::ser::WithoutLength<Vec<_>> = $crate::util::ser::LengthReadable::read_from_fixed_length_buffer(&mut $reader)?;
431431
$field = Some(f.0);
432432
}};
433433
// `upgradable_required` indicates we're reading a required TLV that may have been upgraded

0 commit comments

Comments
 (0)