Skip to content

Commit 087d6e6

Browse files
Require FixedLengthReader in LengthReadable
In general, the codebase currently tends to use the Readable trait with two different semantics -- some objects know when to stop reading because they have a length prefix and some automatically read to the end of the reader. This differing usage can lead to bugs. For objects that read-to-end, it would be much safer if the compiler enforced that they could only be read from a length-limiting reader. We already have a LengthReadable trait that requires the underlying reader to provide the length, which is similar to what we want. So rather than adding an additional trait, here we refactor LengthReadable to require a fixed length reader. Upcoming commits will switch read-to-end structs that are currently read with Readable to use LengthReadable instead.
1 parent b5ae458 commit 087d6e6

File tree

3 files changed

+15
-7
lines changed

3 files changed

+15
-7
lines changed

lightning/src/ln/msgs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2006,7 +2006,7 @@ impl Writeable for TrampolineOnionPacket {
20062006
}
20072007

20082008
impl LengthReadable for TrampolineOnionPacket {
2009-
fn read_from_fixed_length_buffer<R: LengthRead>(r: &mut R) -> Result<Self, DecodeError> {
2009+
fn read_from_fixed_length_buffer<'a, R: Read>(r: &mut FixedLengthReader<'a, R>) -> Result<Self, DecodeError> {
20102010
let version = Readable::read(r)?;
20112011
let public_key = Readable::read(r)?;
20122012

lightning/src/onion_message/packet.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,9 @@ impl Writeable for Packet {
8484
}
8585

8686
impl LengthReadable for Packet {
87-
fn read_from_fixed_length_buffer<R: LengthRead>(r: &mut R) -> Result<Self, DecodeError> {
87+
fn read_from_fixed_length_buffer<'a, R: Read>(
88+
r: &mut FixedLengthReader<'a, R>,
89+
) -> Result<Self, DecodeError> {
8890
const READ_BUFFER_SIZE: usize = 4096;
8991

9092
let version = Readable::read(r)?;

lightning/src/util/ser.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ where
361361
fn read<R: LengthRead>(reader: &mut R, params: P) -> Result<Self, DecodeError>;
362362
}
363363

364-
/// A trait that allows the implementer to be read in from a [`LengthRead`], requiring
364+
/// A trait that allows the implementer to be read in from a [`FixedLengthReader`], requiring
365365
/// the reader to provide the total length of the read.
366366
///
367367
/// Any type that implements [`Readable`] also automatically has a [`LengthReadable`]
@@ -370,13 +370,17 @@ pub trait LengthReadable
370370
where
371371
Self: Sized,
372372
{
373-
/// Reads a `Self` in from the given [`LengthRead`].
374-
fn read_from_fixed_length_buffer<R: LengthRead>(reader: &mut R) -> Result<Self, DecodeError>;
373+
/// Reads a `Self` in from the given [`FixedLengthReader`].
374+
fn read_from_fixed_length_buffer<'a, R: Read>(
375+
reader: &mut FixedLengthReader<'a, R>,
376+
) -> Result<Self, DecodeError>;
375377
}
376378

377379
impl<T: Readable> LengthReadable for T {
378380
#[inline]
379-
fn read_from_fixed_length_buffer<R: LengthRead>(reader: &mut R) -> Result<T, DecodeError> {
381+
fn read_from_fixed_length_buffer<'a, R: Read>(
382+
reader: &mut FixedLengthReader<'a, R>,
383+
) -> Result<T, DecodeError> {
380384
Readable::read(reader)
381385
}
382386
}
@@ -405,7 +409,9 @@ impl<T: Readable> MaybeReadable for T {
405409
pub struct RequiredWrapper<T>(pub Option<T>);
406410
impl<T: LengthReadable> LengthReadable for RequiredWrapper<T> {
407411
#[inline]
408-
fn read_from_fixed_length_buffer<R: LengthRead>(reader: &mut R) -> Result<Self, DecodeError> {
412+
fn read_from_fixed_length_buffer<'a, R: Read>(
413+
reader: &mut FixedLengthReader<'a, R>,
414+
) -> Result<Self, DecodeError> {
409415
Ok(Self(Some(LengthReadable::read_from_fixed_length_buffer(reader)?)))
410416
}
411417
}

0 commit comments

Comments
 (0)