Skip to content

Commit e9399d7

Browse files
Require length limited reader in impl_writeable_msg
See prior two commits. 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 16fdd33 commit e9399d7

File tree

8 files changed

+88
-94
lines changed

8 files changed

+88
-94
lines changed

fuzz/src/chanmon_consistency.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ use lightning::types::payment::{PaymentHash, PaymentPreimage, PaymentSecret};
6767
use lightning::util::config::UserConfig;
6868
use lightning::util::hash_tables::*;
6969
use lightning::util::logger::Logger;
70-
use lightning::util::ser::{Readable, ReadableArgs, Writeable, Writer};
70+
use lightning::util::ser::{LengthReadable, ReadableArgs, Writeable, Writer};
7171
use lightning::util::test_channel_signer::{EnforcementState, TestChannelSigner};
7272

7373
use lightning_invoice::RawBolt11Invoice;
@@ -1103,7 +1103,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
11031103
// update_fail_htlc as we do when we reject a payment.
11041104
let mut msg_ser = update_add.encode();
11051105
msg_ser[1000] ^= 0xff;
1106-
let new_msg = UpdateAddHTLC::read(&mut Cursor::new(&msg_ser)).unwrap();
1106+
let new_msg = UpdateAddHTLC::read_from_fixed_length_buffer(&mut &msg_ser[..]).unwrap();
11071107
dest.handle_update_add_htlc(nodes[$node].get_our_node_id(), &new_msg);
11081108
}
11091109
}

fuzz/src/msg_targets/utils.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,16 @@ 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+
if let Ok(msg) =
54+
<$MsgType as LengthReadable>::read_from_fixed_length_buffer(&mut &$data[..])
55+
{
5556
let mut w = VecWriter(Vec::new());
5657
msg.write(&mut w).unwrap();
5758
assert_eq!(msg.serialized_length(), w.0.len());
5859

5960
let msg =
60-
<$MsgType as Readable>::read(&mut ::lightning::io::Cursor::new(&w.0)).unwrap();
61+
<$MsgType as LengthReadable>::read_from_fixed_length_buffer(&mut &w.0[..]).unwrap();
6162
let mut w_two = VecWriter(Vec::new());
6263
msg.write(&mut w_two).unwrap();
6364
assert_eq!(&w.0[..], &w_two.0[..]);

lightning/src/ln/channelmanager.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ use crate::util::config::{ChannelConfig, ChannelConfigUpdate, ChannelConfigOverr
8181
use crate::util::wakers::{Future, Notifier};
8282
use crate::util::scid_utils::fake_scid;
8383
use crate::util::string::UntrustedString;
84-
use crate::util::ser::{BigSize, FixedLengthReader, Readable, ReadableArgs, MaybeReadable, Writeable, Writer, VecWriter};
84+
use crate::util::ser::{BigSize, FixedLengthReader, LengthReadable, Readable, ReadableArgs, MaybeReadable, Writeable, Writer, VecWriter};
8585
use crate::util::logger::{Level, Logger, WithContext};
8686
use crate::util::errors::APIError;
8787
#[cfg(async_payments)] use {
@@ -12843,14 +12843,14 @@ impl Readable for HTLCFailureMsg {
1284312843
2 => {
1284412844
let length: BigSize = Readable::read(reader)?;
1284512845
let mut s = FixedLengthReader::new(reader, length.0);
12846-
let res = Readable::read(&mut s)?;
12846+
let res = LengthReadable::read_from_fixed_length_buffer(&mut s)?;
1284712847
s.eat_remaining()?; // Return ShortRead if there's actually not enough bytes
1284812848
Ok(HTLCFailureMsg::Relay(res))
1284912849
},
1285012850
3 => {
1285112851
let length: BigSize = Readable::read(reader)?;
1285212852
let mut s = FixedLengthReader::new(reader, length.0);
12853-
let res = Readable::read(&mut s)?;
12853+
let res = LengthReadable::read_from_fixed_length_buffer(&mut s)?;
1285412854
s.eat_remaining()?; // Return ShortRead if there's actually not enough bytes
1285512855
Ok(HTLCFailureMsg::Malformed(res))
1285612856
},

lightning/src/ln/msgs.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -2330,7 +2330,7 @@ impl LengthReadable for TrampolineOnionPacket {
23302330
let public_key = Readable::read(r)?;
23312331

23322332
let mut rd = FixedLengthReader::new(r, hop_data_len);
2333-
let hop_data = WithoutLength::<Vec<u8>>::read(&mut rd)?.0;
2333+
let hop_data = WithoutLength::<Vec<u8>>::read_from_fixed_length_buffer(&mut rd)?.0;
23342334

23352335
let hmac = Readable::read(r)?;
23362336

@@ -3937,7 +3937,7 @@ mod tests {
39373937
use crate::ln::msgs::{self, FinalOnionHopData, OnionErrorPacket, CommonOpenChannelFields, CommonAcceptChannelFields, OutboundTrampolinePayload, TrampolineOnionPacket, InboundOnionForwardPayload, InboundOnionReceivePayload};
39383938
use crate::ln::msgs::SocketAddress;
39393939
use crate::routing::gossip::{NodeAlias, NodeId};
3940-
use crate::util::ser::{BigSize, FixedLengthReader, Hostname, LengthReadable, Readable, ReadableArgs, TransactionU16LenLimited, Writeable};
3940+
use crate::util::ser::{BigSize, Hostname, LengthReadable, Readable, ReadableArgs, TransactionU16LenLimited, Writeable};
39413941
use crate::util::test_utils;
39423942

39433943
use bitcoin::hex::FromHex;
@@ -4876,7 +4876,7 @@ mod tests {
48764876
let encoded_value = closing_signed.encode();
48774877
let target_value = <Vec<u8>>::from_hex("020202020202020202020202020202020202020202020202020202020202020200083a840000034dd977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a").unwrap();
48784878
assert_eq!(encoded_value, target_value);
4879-
assert_eq!(msgs::ClosingSigned::read(&mut Cursor::new(&target_value)).unwrap(), closing_signed);
4879+
assert_eq!(msgs::ClosingSigned::read_from_fixed_length_buffer(&mut &target_value[..]).unwrap(), closing_signed);
48804880

48814881
let closing_signed_with_range = msgs::ClosingSigned {
48824882
channel_id: ChannelId::from_bytes([2; 32]),
@@ -4890,7 +4890,7 @@ mod tests {
48904890
let encoded_value_with_range = closing_signed_with_range.encode();
48914891
let target_value_with_range = <Vec<u8>>::from_hex("020202020202020202020202020202020202020202020202020202020202020200083a840000034dd977cb9b53d93a6ff64bb5f1e158b4094b66e798fb12911168a3ccdf80a83096340a6a95da0ae8d9f776528eecdbb747eb6b545495a4319ed5378e35b21e073a011000000000deadbeef1badcafe01234567").unwrap();
48924892
assert_eq!(encoded_value_with_range, target_value_with_range);
4893-
assert_eq!(msgs::ClosingSigned::read(&mut Cursor::new(&target_value_with_range)).unwrap(),
4893+
assert_eq!(msgs::ClosingSigned::read_from_fixed_length_buffer(&mut &target_value_with_range[..]).unwrap(),
48944894
closing_signed_with_range);
48954895
}
48964896

@@ -5054,7 +5054,7 @@ mod tests {
50545054
let encoded_value = init_msg.encode();
50555055
let target_value = <Vec<u8>>::from_hex("0000000001206fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d61900000000000307017f00000103e8").unwrap();
50565056
assert_eq!(encoded_value, target_value);
5057-
assert_eq!(msgs::Init::read(&mut Cursor::new(&target_value)).unwrap(), init_msg);
5057+
assert_eq!(msgs::Init::read_from_fixed_length_buffer(&mut &target_value[..]).unwrap(), init_msg);
50585058
}
50595059

50605060
#[test]
@@ -5289,9 +5289,10 @@ mod tests {
52895289
assert_eq!(encoded_trampoline_packet.len(), 716);
52905290

52915291
{ // verify that a codec round trip works
5292-
let mut reader = Cursor::new(&encoded_trampoline_packet);
5293-
let mut trampoline_packet_reader = FixedLengthReader::new(&mut reader, encoded_trampoline_packet.len() as u64);
5294-
let decoded_trampoline_packet: TrampolineOnionPacket = <TrampolineOnionPacket as LengthReadable>::read_from_fixed_length_buffer(&mut trampoline_packet_reader).unwrap();
5292+
let decoded_trampoline_packet: TrampolineOnionPacket =
5293+
<TrampolineOnionPacket as LengthReadable>::read_from_fixed_length_buffer(
5294+
&mut &encoded_trampoline_packet[..]
5295+
).unwrap();
52955296
assert_eq!(decoded_trampoline_packet.encode(), encoded_trampoline_packet);
52965297
}
52975298

@@ -5417,7 +5418,7 @@ mod tests {
54175418
let target_value = <Vec<u8>>::from_hex("06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f000186a0000005dc").unwrap();
54185419
assert_eq!(encoded_value, target_value);
54195420

5420-
query_channel_range = Readable::read(&mut Cursor::new(&target_value[..])).unwrap();
5421+
query_channel_range = LengthReadable::read_from_fixed_length_buffer(&mut &target_value[..]).unwrap();
54215422
assert_eq!(query_channel_range.first_blocknum, 100000);
54225423
assert_eq!(query_channel_range.number_of_blocks, 1500);
54235424
}
@@ -5501,7 +5502,7 @@ mod tests {
55015502
let target_value = <Vec<u8>>::from_hex("06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f01").unwrap();
55025503
assert_eq!(encoded_value, target_value);
55035504

5504-
reply_short_channel_ids_end = Readable::read(&mut Cursor::new(&target_value[..])).unwrap();
5505+
reply_short_channel_ids_end = LengthReadable::read_from_fixed_length_buffer(&mut &target_value[..]).unwrap();
55055506
assert_eq!(reply_short_channel_ids_end.chain_hash, expected_chain_hash);
55065507
assert_eq!(reply_short_channel_ids_end.full_information, true);
55075508
}
@@ -5518,7 +5519,9 @@ mod tests {
55185519
let target_value = <Vec<u8>>::from_hex("06226e46111a0b59caaf126043eb5bbf28c34f3a5e332a1fc7b2b73cf188910f5ec57980ffffffff").unwrap();
55195520
assert_eq!(encoded_value, target_value);
55205521

5521-
gossip_timestamp_filter = Readable::read(&mut Cursor::new(&target_value[..])).unwrap();
5522+
gossip_timestamp_filter = LengthReadable::read_from_fixed_length_buffer(
5523+
&mut &target_value[..]
5524+
).unwrap();
55225525
assert_eq!(gossip_timestamp_filter.chain_hash, expected_chain_hash);
55235526
assert_eq!(gossip_timestamp_filter.first_timestamp, 1590000000);
55245527
assert_eq!(gossip_timestamp_filter.timestamp_range, 0xffff_ffff);

lightning/src/ln/peer_handler.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1541,8 +1541,10 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
15411541
try_potential_handleerror!(peer,
15421542
peer.channel_encryptor.decrypt_message(&mut peer.pending_read_buffer[..]));
15431543

1544-
let mut reader = io::Cursor::new(&peer.pending_read_buffer[..peer.pending_read_buffer.len() - 16]);
1545-
let message_result = wire::read(&mut reader, &*self.message_handler.custom_message_handler);
1544+
let message_result = wire::read(
1545+
&mut &peer.pending_read_buffer[..peer.pending_read_buffer.len() - 16],
1546+
&*self.message_handler.custom_message_handler
1547+
);
15461548

15471549
// Reset read buffer
15481550
if peer.pending_read_buffer.capacity() > 8192 { peer.pending_read_buffer = Vec::new(); }

0 commit comments

Comments
 (0)