Skip to content

Commit d1767cd

Browse files
committed
Simplify Readable mutability.
In anticipation of the rust-bitcoin upgrade, which incorporates its own `io::Read` implementation, we need to make our usage compatible with dropping `std::io` and `core2::io`. Notably, in version 0.32.2, `bitcoin::io`'s `Read` is no longer implemented for `&mut R where R: Read + ?Sized`, which results in errors anytime `&mut &mut Readable` is passed instead of `&mut Readable`. This commit fixes those instances.
1 parent 5ab40b2 commit d1767cd

File tree

7 files changed

+32
-30
lines changed

7 files changed

+32
-30
lines changed

lightning-rapid-gossip-sync/src/processing.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ where
6363
}
6464

6565
pub(crate) fn update_network_graph_from_byte_stream_no_std<R: io::Read>(
66-
&self, mut read_cursor: &mut R, current_time_unix: Option<u64>,
66+
&self, read_cursor: &mut R, current_time_unix: Option<u64>,
6767
) -> Result<u32, GraphSyncError> {
6868
log_trace!(self.logger, "Processing RGS data...");
6969
let mut protocol_prefix = [0u8; 3];
@@ -73,7 +73,7 @@ where
7373
return Err(DecodeError::UnknownVersion.into());
7474
}
7575

76-
let version: u8 = Readable::read(&mut read_cursor)?;
76+
let version: u8 = Readable::read(read_cursor)?;
7777
if version != 1 && version != 2 {
7878
return Err(DecodeError::UnknownVersion.into());
7979
}
@@ -187,7 +187,7 @@ where
187187
for address_index in 0..address_count {
188188
let current_byte_count: u8 = Readable::read(read_cursor)?;
189189
let mut address_reader =
190-
FixedLengthReader::new(&mut read_cursor, current_byte_count as u64);
190+
FixedLengthReader::new(read_cursor, current_byte_count as u64);
191191
if let Ok(current_address) = Readable::read(&mut address_reader) {
192192
node_addresses.push(current_address);
193193
if address_reader.bytes_remain() {
@@ -330,11 +330,11 @@ where
330330
}
331331

332332
// obtain default values for non-incremental updates
333-
let default_cltv_expiry_delta: u16 = Readable::read(&mut read_cursor)?;
334-
let default_htlc_minimum_msat: u64 = Readable::read(&mut read_cursor)?;
335-
let default_fee_base_msat: u32 = Readable::read(&mut read_cursor)?;
336-
let default_fee_proportional_millionths: u32 = Readable::read(&mut read_cursor)?;
337-
let default_htlc_maximum_msat: u64 = Readable::read(&mut read_cursor)?;
333+
let default_cltv_expiry_delta: u16 = Readable::read(read_cursor)?;
334+
let default_htlc_minimum_msat: u64 = Readable::read(read_cursor)?;
335+
let default_fee_base_msat: u32 = Readable::read(read_cursor)?;
336+
let default_fee_proportional_millionths: u32 = Readable::read(read_cursor)?;
337+
let default_htlc_maximum_msat: u64 = Readable::read(read_cursor)?;
338338

339339
let mut previous_channel_direction = None;
340340

lightning/src/blinded_path/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,14 +275,16 @@ impl Writeable for BlindedPath {
275275

276276
impl Readable for BlindedPath {
277277
fn read<R: io::Read>(r: &mut R) -> Result<Self, DecodeError> {
278-
let mut first_byte: u8 = Readable::read(r)?;
278+
let first_byte: u8 = Readable::read(r)?;
279279
let introduction_node = match first_byte {
280280
0 => IntroductionNode::DirectedShortChannelId(Direction::NodeOne, Readable::read(r)?),
281281
1 => IntroductionNode::DirectedShortChannelId(Direction::NodeTwo, Readable::read(r)?),
282282
2|3 => {
283283
use io::Read;
284-
let mut pubkey_read = core::slice::from_mut(&mut first_byte).chain(r.by_ref());
285-
IntroductionNode::NodeId(Readable::read(&mut pubkey_read)?)
284+
let mut bytes = [0; 33];
285+
bytes[0] = first_byte;
286+
r.read_exact(&mut bytes[1..])?;
287+
IntroductionNode::NodeId(Readable::read(&mut &bytes[..])?)
286288
},
287289
_ => return Err(DecodeError::InvalidValue),
288290
};

lightning/src/crypto/streams.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,12 @@ impl<T: Readable> LengthReadableArgs<[u8; 32]> for ChaChaPolyReadAdapter<T> {
5757
// Simultaneously read and decrypt an object from a LengthRead, storing it in Self::readable.
5858
// LengthRead must be used instead of std::io::Read because we need the total length to separate
5959
// out the tag at the end.
60-
fn read<R: LengthRead>(mut r: &mut R, secret: [u8; 32]) -> Result<Self, DecodeError> {
60+
fn read<R: LengthRead>(r: &mut R, secret: [u8; 32]) -> Result<Self, DecodeError> {
6161
if r.total_bytes() < 16 { return Err(DecodeError::InvalidValue) }
6262

6363
let mut chacha = ChaCha20Poly1305RFC::new(&secret, &[0; 12], &[]);
6464
let decrypted_len = r.total_bytes() - 16;
65-
let s = FixedLengthReader::new(&mut r, decrypted_len);
65+
let s = FixedLengthReader::new(r, decrypted_len);
6666
let mut chacha_stream = ChaChaPolyReader { chacha: &mut chacha, read: s };
6767
let readable: T = Readable::read(&mut chacha_stream)?;
6868
chacha_stream.read.eat_remaining()?;
@@ -194,7 +194,7 @@ mod tests {
194194

195195
// Now deserialize the object back and make sure it matches the original.
196196
let mut read_adapter: Option<ChaChaPolyReadAdapter<TestWriteable>> = None;
197-
decode_tlv_stream!(&writer.0[..], {
197+
decode_tlv_stream!(&mut &writer.0[..], {
198198
(1, read_adapter, (option: LengthReadableArgs, rho)),
199199
});
200200
assert_eq!(writeable, read_adapter.unwrap().readable);

lightning/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ pub mod io_extras {
144144
Ok(count)
145145
}
146146

147-
pub fn read_to_end<D: io::Read>(mut d: D) -> Result<alloc::vec::Vec<u8>, io::Error> {
147+
pub fn read_to_end<D: Read>(mut d: &mut D) -> Result<alloc::vec::Vec<u8>, io::Error> {
148148
let mut result = vec![];
149149
let mut buf = [0u8; 64];
150150
loop {

lightning/src/ln/msgs.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2771,8 +2771,8 @@ impl<NS: Deref> ReadableArgs<(Option<PublicKey>, &NS)> for InboundOnionPayload w
27712771
let mut custom_tlvs = Vec::new();
27722772

27732773
let tlv_len = BigSize::read(r)?;
2774-
let rd = FixedLengthReader::new(r, tlv_len.0);
2775-
decode_tlv_stream_with_custom_tlv_decode!(rd, {
2774+
let mut rd = FixedLengthReader::new(r, tlv_len.0);
2775+
decode_tlv_stream_with_custom_tlv_decode!(&mut rd, {
27762776
(2, amt, (option, encoding: (u64, HighZeroBytesDroppedBigSize))),
27772777
(4, cltv_value, (option, encoding: (u32, HighZeroBytesDroppedBigSize))),
27782778
(6, short_id, option),

lightning/src/util/ser.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -164,18 +164,18 @@ impl<'a, R: Read> LengthRead for FixedLengthReader<'a, R> {
164164
/// between "EOF reached before we started" and "EOF reached mid-read".
165165
///
166166
/// This is not exported to bindings users as manual TLV building is not currently supported in bindings
167-
pub struct ReadTrackingReader<R: Read> {
168-
read: R,
167+
pub struct ReadTrackingReader<'a, R: Read> {
168+
read: &'a mut R,
169169
/// Returns whether we have read from this reader or not yet.
170170
pub have_read: bool,
171171
}
172-
impl<R: Read> ReadTrackingReader<R> {
172+
impl<'a, R: Read> ReadTrackingReader<'a, R> {
173173
/// Returns a new [`ReadTrackingReader`].
174-
pub fn new(read: R) -> Self {
174+
pub fn new(read: &'a mut R) -> Self {
175175
Self { read, have_read: false }
176176
}
177177
}
178-
impl<R: Read> Read for ReadTrackingReader<R> {
178+
impl<'a, R: Read> Read for ReadTrackingReader<'a, R> {
179179
#[inline]
180180
fn read(&mut self, dest: &mut [u8]) -> Result<usize, io::Error> {
181181
match self.read.read(dest) {
@@ -669,7 +669,7 @@ impl<T: MaybeReadable> Readable for WithoutLength<Vec<T>> {
669669
fn read<R: Read>(mut reader: &mut R) -> Result<Self, DecodeError> {
670670
let mut values = Vec::new();
671671
loop {
672-
let mut track_read = ReadTrackingReader::new(&mut reader);
672+
let mut track_read = ReadTrackingReader::new(reader);
673673
match MaybeReadable::read(&mut track_read) {
674674
Ok(Some(v)) => { values.push(v); },
675675
Ok(None) => { },

lightning/src/util/ser_macros.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ macro_rules! _decode_tlv_stream_match_check {
456456
/// For example,
457457
/// ```
458458
/// # use lightning::decode_tlv_stream;
459-
/// # fn read<R: lightning::io::Read> (stream: R) -> Result<(), lightning::ln::msgs::DecodeError> {
459+
/// # fn read<R: lightning::io::Read> (stream: &mut R) -> Result<(), lightning::ln::msgs::DecodeError> {
460460
/// let mut required_value = 0u64;
461461
/// let mut optional_value: Option<u64> = None;
462462
/// decode_tlv_stream!(stream, {
@@ -509,7 +509,7 @@ macro_rules! _decode_tlv_stream_range {
509509
$(, $decode_custom_tlv: expr)?) => { {
510510
use $crate::ln::msgs::DecodeError;
511511
let mut last_seen_type: Option<u64> = None;
512-
let mut stream_ref = $stream;
512+
let stream_ref = $stream;
513513
'tlv_read: loop {
514514
use $crate::util::ser;
515515

@@ -519,7 +519,7 @@ macro_rules! _decode_tlv_stream_range {
519519
// determine whether we should break or return ShortRead if we get an
520520
// UnexpectedEof. This should in every case be largely cosmetic, but its nice to
521521
// pass the TLV test vectors exactly, which require this distinction.
522-
let mut tracking_reader = ser::ReadTrackingReader::new(&mut stream_ref);
522+
let mut tracking_reader = ser::ReadTrackingReader::new(stream_ref);
523523
match <$crate::util::ser::BigSize as $crate::util::ser::Readable>::read(&mut tracking_reader) {
524524
Err(DecodeError::ShortRead) => {
525525
if !tracking_reader.have_read {
@@ -555,8 +555,8 @@ macro_rules! _decode_tlv_stream_range {
555555
last_seen_type = Some(typ.0);
556556

557557
// Finally, read the length and value itself:
558-
let length: ser::BigSize = $crate::util::ser::Readable::read(&mut stream_ref)?;
559-
let mut s = ser::FixedLengthReader::new(&mut stream_ref, length.0);
558+
let length: ser::BigSize = $crate::util::ser::Readable::read(stream_ref)?;
559+
let mut s = ser::FixedLengthReader::new(stream_ref, length.0);
560560
match typ.0 {
561561
$(_t if $crate::_decode_tlv_stream_match_check!(_t, $type, $fieldty) => {
562562
$crate::_decode_tlv!($stream, s, $field, $fieldty);
@@ -1102,7 +1102,7 @@ macro_rules! impl_writeable_tlv_based_enum {
11021102
}),*
11031103
$($tuple_variant_id => {
11041104
let length: $crate::util::ser::BigSize = $crate::util::ser::Readable::read(reader)?;
1105-
let mut s = $crate::util::ser::FixedLengthReader::new(&mut reader, length.0);
1105+
let mut s = $crate::util::ser::FixedLengthReader::new(reader, length.0);
11061106
let res = $crate::util::ser::Readable::read(&mut s)?;
11071107
if s.bytes_remain() {
11081108
s.eat_remaining()?; // Return ShortRead if there's actually not enough bytes
@@ -1214,7 +1214,7 @@ macro_rules! impl_writeable_tlv_based_enum_upgradable {
12141214
}),*
12151215
$($tuple_variant_id => {
12161216
let length: $crate::util::ser::BigSize = $crate::util::ser::Readable::read(reader)?;
1217-
let mut s = $crate::util::ser::FixedLengthReader::new(&mut reader, length.0);
1217+
let mut s = $crate::util::ser::FixedLengthReader::new(reader, length.0);
12181218
let res = $crate::util::ser::Readable::read(&mut s)?;
12191219
if s.bytes_remain() {
12201220
s.eat_remaining()?; // Return ShortRead if there's actually not enough bytes

0 commit comments

Comments
 (0)