Skip to content

Commit cea39e7

Browse files
committed
Don't consume readers with FixedLengthReader
We can't always assume that we're done reading after using a FixedLengthReader. In some cases, we may need to read a set of length-prefixed objects one at a time, and we'd like to do so without incurring an additional allocation by reading a number of bytes first to then deserialize them.
1 parent 6d5c952 commit cea39e7

File tree

4 files changed

+25
-25
lines changed

4 files changed

+25
-25
lines changed

lightning/src/crypto/streams.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ mod tests {
151151
let writeable_len = $obj.serialized_length() as u64 + 16;
152152
let write_adapter = ChaChaPolyWriteAdapter::new(rho, &$obj);
153153
let encrypted_writeable_bytes = write_adapter.encode();
154-
let encrypted_writeable = &encrypted_writeable_bytes[..];
154+
let encrypted_writeable = &mut &encrypted_writeable_bytes[..];
155155

156156
// Now deserialize the object back and make sure it matches the original.
157157
let mut rd = FixedLengthReader::new(encrypted_writeable, writeable_len);

lightning/src/events/mod.rs

+16-16
Original file line numberDiff line numberDiff line change
@@ -1275,7 +1275,7 @@ impl MaybeReadable for Event {
12751275
// Note that we do not write a length-prefixed TLV for FundingGenerationReady events.
12761276
0u8 => Ok(None),
12771277
1u8 => {
1278-
let f = || {
1278+
let mut f = || {
12791279
let mut payment_hash = PaymentHash([0; 32]);
12801280
let mut payment_preimage = None;
12811281
let mut payment_secret = None;
@@ -1323,7 +1323,7 @@ impl MaybeReadable for Event {
13231323
f()
13241324
},
13251325
2u8 => {
1326-
let f = || {
1326+
let mut f = || {
13271327
let mut payment_preimage = PaymentPreimage([0; 32]);
13281328
let mut payment_hash = None;
13291329
let mut payment_id = None;
@@ -1347,7 +1347,7 @@ impl MaybeReadable for Event {
13471347
f()
13481348
},
13491349
3u8 => {
1350-
let f = || {
1350+
let mut f = || {
13511351
#[cfg(test)]
13521352
let error_code = Readable::read(reader)?;
13531353
#[cfg(test)]
@@ -1390,7 +1390,7 @@ impl MaybeReadable for Event {
13901390
},
13911391
4u8 => Ok(None),
13921392
5u8 => {
1393-
let f = || {
1393+
let mut f = || {
13941394
let mut outputs = WithoutLength(Vec::new());
13951395
let mut channel_id: Option<ChannelId> = None;
13961396
read_tlv_fields!(reader, {
@@ -1426,7 +1426,7 @@ impl MaybeReadable for Event {
14261426
}))
14271427
},
14281428
7u8 => {
1429-
let f = || {
1429+
let mut f = || {
14301430
let mut total_fee_earned_msat = None;
14311431
let mut prev_channel_id = None;
14321432
let mut claim_from_onchain_tx = false;
@@ -1449,7 +1449,7 @@ impl MaybeReadable for Event {
14491449
f()
14501450
},
14511451
9u8 => {
1452-
let f = || {
1452+
let mut f = || {
14531453
let mut channel_id = ChannelId::new_zero();
14541454
let mut reason = UpgradableRequired(None);
14551455
let mut user_channel_id_low_opt: Option<u64> = None;
@@ -1479,7 +1479,7 @@ impl MaybeReadable for Event {
14791479
f()
14801480
},
14811481
11u8 => {
1482-
let f = || {
1482+
let mut f = || {
14831483
let mut channel_id = ChannelId::new_zero();
14841484
let mut transaction = Transaction{ version: 2, lock_time: LockTime::ZERO, input: Vec::new(), output: Vec::new() };
14851485
read_tlv_fields!(reader, {
@@ -1491,7 +1491,7 @@ impl MaybeReadable for Event {
14911491
f()
14921492
},
14931493
13u8 => {
1494-
let f = || {
1494+
let mut f = || {
14951495
_init_and_read_len_prefixed_tlv_fields!(reader, {
14961496
(0, payment_id, required),
14971497
(2, payment_hash, option),
@@ -1507,7 +1507,7 @@ impl MaybeReadable for Event {
15071507
f()
15081508
},
15091509
15u8 => {
1510-
let f = || {
1510+
let mut f = || {
15111511
let mut payment_hash = PaymentHash([0; 32]);
15121512
let mut payment_id = PaymentId([0; 32]);
15131513
let mut reason = None;
@@ -1529,7 +1529,7 @@ impl MaybeReadable for Event {
15291529
Ok(None)
15301530
},
15311531
19u8 => {
1532-
let f = || {
1532+
let mut f = || {
15331533
let mut payment_hash = PaymentHash([0; 32]);
15341534
let mut purpose = UpgradableRequired(None);
15351535
let mut amount_msat = 0;
@@ -1556,7 +1556,7 @@ impl MaybeReadable for Event {
15561556
f()
15571557
},
15581558
21u8 => {
1559-
let f = || {
1559+
let mut f = || {
15601560
_init_and_read_len_prefixed_tlv_fields!(reader, {
15611561
(0, payment_id, required),
15621562
(2, payment_hash, required),
@@ -1572,7 +1572,7 @@ impl MaybeReadable for Event {
15721572
f()
15731573
},
15741574
23u8 => {
1575-
let f = || {
1575+
let mut f = || {
15761576
_init_and_read_len_prefixed_tlv_fields!(reader, {
15771577
(0, payment_id, required),
15781578
(2, payment_hash, required),
@@ -1590,7 +1590,7 @@ impl MaybeReadable for Event {
15901590
f()
15911591
},
15921592
25u8 => {
1593-
let f = || {
1593+
let mut f = || {
15941594
let mut prev_channel_id = ChannelId::new_zero();
15951595
let mut failed_next_destination_opt = UpgradableRequired(None);
15961596
read_tlv_fields!(reader, {
@@ -1606,7 +1606,7 @@ impl MaybeReadable for Event {
16061606
},
16071607
27u8 => Ok(None),
16081608
29u8 => {
1609-
let f = || {
1609+
let mut f = || {
16101610
let mut channel_id = ChannelId::new_zero();
16111611
let mut user_channel_id: u128 = 0;
16121612
let mut counterparty_node_id = RequiredWrapper(None);
@@ -1628,7 +1628,7 @@ impl MaybeReadable for Event {
16281628
f()
16291629
},
16301630
31u8 => {
1631-
let f = || {
1631+
let mut f = || {
16321632
let mut channel_id = ChannelId::new_zero();
16331633
let mut user_channel_id: u128 = 0;
16341634
let mut former_temporary_channel_id = None;
@@ -1656,7 +1656,7 @@ impl MaybeReadable for Event {
16561656
f()
16571657
},
16581658
33u8 => {
1659-
let f = || {
1659+
let mut f = || {
16601660
_init_and_read_len_prefixed_tlv_fields!(reader, {
16611661
(0, payment_id, required),
16621662
});

lightning/src/util/ser.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,14 @@ impl Writer for LengthCalculatingWriter {
108108
/// forward to ensure we always consume exactly the fixed length specified.
109109
///
110110
/// This is not exported to bindings users as manual TLV building is not currently supported in bindings
111-
pub struct FixedLengthReader<R: Read> {
112-
read: R,
111+
pub struct FixedLengthReader<'a, R: Read> {
112+
read: &'a mut R,
113113
bytes_read: u64,
114114
total_bytes: u64,
115115
}
116-
impl<R: Read> FixedLengthReader<R> {
116+
impl<'a, R: Read> FixedLengthReader<'a, R> {
117117
/// Returns a new [`FixedLengthReader`].
118-
pub fn new(read: R, total_bytes: u64) -> Self {
118+
pub fn new(read: &'a mut R, total_bytes: u64) -> Self {
119119
Self { read, bytes_read: 0, total_bytes }
120120
}
121121

@@ -136,7 +136,7 @@ impl<R: Read> FixedLengthReader<R> {
136136
}
137137
}
138138
}
139-
impl<R: Read> Read for FixedLengthReader<R> {
139+
impl<'a, R: Read> Read for FixedLengthReader<'a, R> {
140140
#[inline]
141141
fn read(&mut self, dest: &mut [u8]) -> Result<usize, io::Error> {
142142
if self.total_bytes == self.bytes_read {
@@ -154,7 +154,7 @@ impl<R: Read> Read for FixedLengthReader<R> {
154154
}
155155
}
156156

157-
impl<R: Read> LengthRead for FixedLengthReader<R> {
157+
impl<'a, R: Read> LengthRead for FixedLengthReader<'a, R> {
158158
#[inline]
159159
fn total_bytes(&self) -> u64 {
160160
self.total_bytes

lightning/src/util/ser_macros.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1033,7 +1033,7 @@ macro_rules! impl_writeable_tlv_based_enum {
10331033
$($variant_id => {
10341034
// Because read_tlv_fields creates a labeled loop, we cannot call it twice
10351035
// in the same function body. Instead, we define a closure and call it.
1036-
let f = || {
1036+
let mut f = || {
10371037
$crate::_init_and_read_len_prefixed_tlv_fields!(reader, {
10381038
$(($type, $field, $fieldty)),*
10391039
});
@@ -1087,7 +1087,7 @@ macro_rules! impl_writeable_tlv_based_enum_upgradable {
10871087
$($variant_id => {
10881088
// Because read_tlv_fields creates a labeled loop, we cannot call it twice
10891089
// in the same function body. Instead, we define a closure and call it.
1090-
let f = || {
1090+
let mut f = || {
10911091
$crate::_init_and_read_len_prefixed_tlv_fields!(reader, {
10921092
$(($type, $field, $fieldty)),*
10931093
});

0 commit comments

Comments
 (0)