Skip to content

Commit e520d20

Browse files
Use LengthReadable in impl_writeable_msg
See previous commit. When deserializing objects via this macro, there is no length prefix so the deser code will read the provided reader until it runs out of bytes. Readable is not an appropriate trait for this situation because it should only be used for structs that are prefixed with a length and know when to stop reading. LengthReadable instead requires that the caller supply only the bytes that are reserved for this struct.
1 parent 087d6e6 commit e520d20

File tree

8 files changed

+116
-80
lines changed

8 files changed

+116
-80
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ use lightning::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
6565
use lightning::util::config::UserConfig;
6666
use lightning::util::hash_tables::*;
6767
use lightning::util::logger::Logger;
68-
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
68+
use lightning::util::ser::{FixedLengthReader, LengthReadable, ReadableArgs, Writeable, Writer};
6969
use lightning::util::test_channel_signer::{EnforcementState, TestChannelSigner};
7070

7171
use lightning_invoice::RawBolt11Invoice;
@@ -1101,7 +1101,9 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
11011101
// update_fail_htlc as we do when we reject a payment.
11021102
let mut msg_ser = update_add.encode();
11031103
msg_ser[1000] ^= 0xff;
1104-
let new_msg = UpdateAddHTLC::read(&mut Cursor::new(&msg_ser)).unwrap();
1104+
let mut cursor = Cursor::new(&msg_ser);
1105+
let mut reader = FixedLengthReader::new(&mut cursor, msg_ser.len() as u64);
1106+
let new_msg = UpdateAddHTLC::read_from_fixed_length_buffer(&mut reader).unwrap();
11051107
dest.handle_update_add_htlc(nodes[$node].get_our_node_id(), &new_msg);
11061108
}
11071109
}

fuzz/src/msg_targets/utils.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,17 @@ macro_rules! test_msg {
4949
#[macro_export]
5050
macro_rules! test_msg_simple {
5151
($MsgType: path, $data: ident) => {{
52-
use lightning::util::ser::{Readable, Writeable};
53-
let mut r = ::lightning::io::Cursor::new($data);
54-
if let Ok(msg) = <$MsgType as Readable>::read(&mut r) {
52+
use lightning::util::ser::{LengthReadable, Writeable};
53+
let mut s = ::lightning::io::Cursor::new($data);
54+
let mut r = ::lightning::util::ser::FixedLengthReader::new(&mut s, $data.len() as u64);
55+
if let Ok(msg) = <$MsgType as LengthReadable>::read_from_fixed_length_buffer(&mut r) {
5556
let mut w = VecWriter(Vec::new());
5657
msg.write(&mut w).unwrap();
5758
assert_eq!(msg.serialized_length(), w.0.len());
5859

59-
let msg =
60-
<$MsgType as Readable>::read(&mut ::lightning::io::Cursor::new(&w.0)).unwrap();
60+
let mut s = ::lightning::io::Cursor::new(&w.0);
61+
let mut r = ::lightning::util::ser::FixedLengthReader::new(&mut s, w.0.len() as u64);
62+
let msg = <$MsgType as LengthReadable>::read_from_fixed_length_buffer(&mut r).unwrap();
6163
let mut w_two = VecWriter(Vec::new());
6264
msg.write(&mut w_two).unwrap();
6365
assert_eq!(&w.0[..], &w_two.0[..]);

lightning/src/ln/channelmanager.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ use crate::util::config::{ChannelConfig, ChannelConfigUpdate, ChannelConfigOverr
8383
use crate::util::wakers::{Future, Notifier};
8484
use crate::util::scid_utils::fake_scid;
8585
use crate::util::string::UntrustedString;
86-
use crate::util::ser::{BigSize, FixedLengthReader, Readable, ReadableArgs, MaybeReadable, Writeable, Writer, VecWriter};
86+
use crate::util::ser::{BigSize, FixedLengthReader, LengthReadable, Readable, ReadableArgs, MaybeReadable, Writeable, Writer, VecWriter};
8787
use crate::util::logger::{Level, Logger, WithContext};
8888
use crate::util::errors::APIError;
8989
#[cfg(async_payments)] use {
@@ -12882,14 +12882,14 @@ impl Readable for HTLCFailureMsg {
1288212882
2 => {
1288312883
let length: BigSize = Readable::read(reader)?;
1288412884
let mut s = FixedLengthReader::new(reader, length.0);
12885-
let res = Readable::read(&mut s)?;
12885+
let res = LengthReadable::read_from_fixed_length_buffer(&mut s)?;
1288612886
s.eat_remaining()?; // Return ShortRead if there's actually not enough bytes
1288712887
Ok(HTLCFailureMsg::Relay(res))
1288812888
},
1288912889
3 => {
1289012890
let length: BigSize = Readable::read(reader)?;
1289112891
let mut s = FixedLengthReader::new(reader, length.0);
12892-
let res = Readable::read(&mut s)?;
12892+
let res = LengthReadable::read_from_fixed_length_buffer(&mut s)?;
1289312893
s.eat_remaining()?; // Return ShortRead if there's actually not enough bytes
1289412894
Ok(HTLCFailureMsg::Malformed(res))
1289512895
},

lightning/src/ln/msgs.rs

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2012,7 +2012,7 @@ impl LengthReadable for TrampolineOnionPacket {
20122012

20132013
let hop_data_len = r.total_bytes().saturating_sub(66); // 1 (version) + 33 (pubkey) + 32 (HMAC) = 66
20142014
let mut rd = FixedLengthReader::new(r, hop_data_len);
2015-
let hop_data = WithoutLength::<Vec<u8>>::read(&mut rd)?.0;
2015+
let hop_data = WithoutLength::<Vec<u8>>::read_from_fixed_length_buffer(&mut rd)?.0;
20162016

20172017
let hmac = Readable::read(r)?;
20182018

@@ -4379,7 +4379,9 @@ mod tests {
43794379
let encoded_value = closing_signed.encode();
43804380
let target_value = <Vec<u8>>::from_hex("020202020202020202020202020202020202020202020202020202020202020200083a840000034dd977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a").unwrap();
43814381
assert_eq!(encoded_value, target_value);
4382-
assert_eq!(msgs::ClosingSigned::read(&mut Cursor::new(&target_value)).unwrap(), closing_signed);
4382+
let mut msg_stream = Cursor::new(&target_value);
4383+
let mut msg_reader = FixedLengthReader::new(&mut msg_stream, target_value.len() as u64);
4384+
assert_eq!(msgs::ClosingSigned::read_from_fixed_length_buffer(&mut msg_reader).unwrap(), closing_signed);
43834385

43844386
let closing_signed_with_range = msgs::ClosingSigned {
43854387
channel_id: ChannelId::from_bytes([2; 32]),
@@ -4393,7 +4395,9 @@ mod tests {
43934395
let encoded_value_with_range = closing_signed_with_range.encode();
43944396
let target_value_with_range = <Vec<u8>>::from_hex("020202020202020202020202020202020202020202020202020202020202020200083a840000034dd977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a011000000000deadbeef1badcafe01234567").unwrap();
43954397
assert_eq!(encoded_value_with_range, target_value_with_range);
4396-
assert_eq!(msgs::ClosingSigned::read(&mut Cursor::new(&target_value_with_range)).unwrap(),
4398+
let mut msg_stream = Cursor::new(&target_value_with_range);
4399+
let mut msg_reader = FixedLengthReader::new(&mut msg_stream, target_value_with_range.len() as u64);
4400+
assert_eq!(msgs::ClosingSigned::read_from_fixed_length_buffer(&mut msg_reader).unwrap(),
43974401
closing_signed_with_range);
43984402
}
43994403

@@ -4557,7 +4561,9 @@ mod tests {
45574561
let encoded_value = init_msg.encode();
45584562
let target_value = <Vec<u8>>::from_hex("0000000001206fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d61900000000000307017f00000103e8").unwrap();
45594563
assert_eq!(encoded_value, target_value);
4560-
assert_eq!(msgs::Init::read(&mut Cursor::new(&target_value)).unwrap(), init_msg);
4564+
let mut msg_stream = Cursor::new(&target_value);
4565+
let mut msg_reader = FixedLengthReader::new(&mut msg_stream, target_value.len() as u64);
4566+
assert_eq!(msgs::Init::read_from_fixed_length_buffer(&mut msg_reader).unwrap(), init_msg);
45614567
}
45624568

45634569
#[test]
@@ -4794,7 +4800,8 @@ mod tests {
47944800
{ // verify that a codec round trip works
47954801
let mut reader = Cursor::new(&encoded_trampoline_packet);
47964802
let mut trampoline_packet_reader = FixedLengthReader::new(&mut reader, encoded_trampoline_packet.len() as u64);
4797-
let decoded_trampoline_packet: TrampolineOnionPacket = <TrampolineOnionPacket as LengthReadable>::read_from_fixed_length_buffer(&mut trampoline_packet_reader).unwrap();
4803+
let decoded_trampoline_packet: TrampolineOnionPacket =
4804+
<TrampolineOnionPacket as LengthReadable>::read_from_fixed_length_buffer(&mut trampoline_packet_reader).unwrap();
47984805
assert_eq!(decoded_trampoline_packet.encode(), encoded_trampoline_packet);
47994806
}
48004807

@@ -4920,7 +4927,9 @@ mod tests {
49204927
let target_value = <Vec<u8>>::from_hex("06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f000186a0000005dc").unwrap();
49214928
assert_eq!(encoded_value, target_value);
49224929

4923-
query_channel_range = Readable::read(&mut Cursor::new(&target_value[..])).unwrap();
4930+
let mut msg_stream = Cursor::new(&target_value[..]);
4931+
let mut msg_reader = FixedLengthReader::new(&mut msg_stream, target_value.len() as u64);
4932+
query_channel_range = LengthReadable::read_from_fixed_length_buffer(&mut msg_reader).unwrap();
49244933
assert_eq!(query_channel_range.first_blocknum, 100000);
49254934
assert_eq!(query_channel_range.number_of_blocks, 1500);
49264935
}
@@ -5004,7 +5013,9 @@ mod tests {
50045013
let target_value = <Vec<u8>>::from_hex("06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f01").unwrap();
50055014
assert_eq!(encoded_value, target_value);
50065015

5007-
reply_short_channel_ids_end = Readable::read(&mut Cursor::new(&target_value[..])).unwrap();
5016+
let mut msg_stream = Cursor::new(&target_value[..]);
5017+
let mut msg_reader = FixedLengthReader::new(&mut msg_stream, target_value.len() as u64);
5018+
reply_short_channel_ids_end = LengthReadable::read_from_fixed_length_buffer(&mut msg_reader).unwrap();
50085019
assert_eq!(reply_short_channel_ids_end.chain_hash, expected_chain_hash);
50095020
assert_eq!(reply_short_channel_ids_end.full_information, true);
50105021
}
@@ -5021,7 +5032,10 @@ mod tests {
50215032
let target_value = <Vec<u8>>::from_hex("06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f5ec57980ffffffff").unwrap();
50225033
assert_eq!(encoded_value, target_value);
50235034

5024-
gossip_timestamp_filter = Readable::read(&mut Cursor::new(&target_value[..])).unwrap();
5035+
let mut stream = Cursor::new(&target_value[..]);
5036+
gossip_timestamp_filter = LengthReadable::read_from_fixed_length_buffer(
5037+
&mut FixedLengthReader::new(&mut stream, target_value.len() as u64)
5038+
).unwrap();
50255039
assert_eq!(gossip_timestamp_filter.chain_hash, expected_chain_hash);
50265040
assert_eq!(gossip_timestamp_filter.first_timestamp, 1590000000);
50275041
assert_eq!(gossip_timestamp_filter.timestamp_range, 0xffff_ffff);

lightning/src/ln/peer_handler.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1544,7 +1544,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
15441544
try_potential_handleerror!(peer,
15451545
peer.channel_encryptor.decrypt_message(&mut peer.pending_read_buffer[..]));
15461546

1547-
let mut reader = io::Cursor::new(&peer.pending_read_buffer[..peer.pending_read_buffer.len() - 16]);
1547+
let mut cursor = io::Cursor::new(&peer.pending_read_buffer[..peer.pending_read_buffer.len() - 16]);
1548+
let mut reader = crate::util::ser::FixedLengthReader::new(&mut cursor, (peer.pending_read_buffer.len() - 16) as u64);
15481549
let message_result = wire::read(&mut reader, &*self.message_handler.custom_message_handler);
15491550

15501551
// Reset read buffer

0 commit comments

Comments
 (0)