Skip to content

Commit 1077825

Browse files
committed
Address custom HTLC TLV fixups
Don't collect iterators to compare, minorly simplify encoding the keysend TLV, combine the _encode_tlv_stream variants to check that the ordering of TLVs is correct including custom TLVs.
1 parent bd90bd2 commit 1077825

File tree

3 files changed

+18
-22
lines changed

3 files changed

+18
-22
lines changed

lightning/src/ln/msgs.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -1987,10 +1987,8 @@ impl Writeable for OutboundOnionPayload {
19871987
// We need to update [`ln::outbound_payment::RecipientOnionFields::with_custom_tlvs`]
19881988
// to reject any reserved types in the experimental range if new ones are ever
19891989
// standardized.
1990-
let preimage = if let Some(ref preimage) = keysend_preimage {
1991-
Some((5482373484, preimage.encode()))
1992-
} else { None };
1993-
let mut custom_tlvs: Vec<&(u64, Vec<u8>)> = custom_tlvs.iter().chain(preimage.iter()).collect();
1990+
let keysend_tlv = keysend_preimage.map(|preimage| (5482373484, preimage.encode()));
1991+
let mut custom_tlvs: Vec<&(u64, Vec<u8>)> = custom_tlvs.iter().chain(keysend_tlv.iter()).collect();
19941992
custom_tlvs.sort_unstable_by_key(|(typ, _)| *typ);
19951993
_encode_varint_length_prefixed_tlv!(w, {
19961994
(2, HighZeroBytesDroppedBigSize(*amt_msat), required),

lightning/src/ln/outbound_payment.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -515,9 +515,9 @@ impl RecipientOnionFields {
515515
let tlvs = &mut self.custom_tlvs;
516516
let further_tlvs = &mut further_htlc_fields.custom_tlvs;
517517

518-
let even_tlvs: Vec<&(u64, Vec<u8>)> = tlvs.iter().filter(|(typ, _)| *typ % 2 == 0).collect();
519-
let further_even_tlvs: Vec<&(u64, Vec<u8>)> = further_tlvs.iter().filter(|(typ, _)| *typ % 2 == 0).collect();
520-
if even_tlvs != further_even_tlvs { return Err(()) }
518+
let even_tlvs = tlvs.iter().filter(|(typ, _)| *typ % 2 == 0);
519+
let further_even_tlvs = further_tlvs.iter().filter(|(typ, _)| *typ % 2 == 0);
520+
if even_tlvs.ne(further_even_tlvs) { return Err(()) }
521521

522522
tlvs.retain(|tlv| further_tlvs.iter().any(|further_tlv| tlv == further_tlv));
523523
further_tlvs.retain(|further_tlv| tlvs.iter().any(|tlv| tlv == further_tlv));

lightning/src/util/ser_macros.rs

+13-15
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ macro_rules! _check_encoded_tlv_order {
110110
///
111111
/// For example,
112112
/// ```
113+
/// # use lightning::_encode_tlv_stream;
113114
/// # use lightning::encode_tlv_stream;
114115
/// # fn write<W: lightning::util::ser::Writer> (stream: &mut W) -> Result<(), lightning::io::Error> {
115116
/// let mut required_value = 0u64;
@@ -143,6 +144,9 @@ macro_rules! encode_tlv_stream {
143144
#[macro_export]
144145
macro_rules! _encode_tlv_stream {
145146
($stream: expr, {$(($type: expr, $field: expr, $fieldty: tt)),* $(,)*}) => { {
147+
_encode_tlv_stream!($stream, { $(($type, $field, $fieldty)),* }, &[])
148+
} };
149+
($stream: expr, {$(($type: expr, $field: expr, $fieldty: tt)),* $(,)*}, $extra_tlvs: expr) => { {
146150
#[allow(unused_imports)]
147151
use $crate::{
148152
ln::msgs::DecodeError,
@@ -154,6 +158,10 @@ macro_rules! _encode_tlv_stream {
154158
$(
155159
$crate::_encode_tlv!($stream, $type, $field, $fieldty);
156160
)*
161+
for tlv in $extra_tlvs {
162+
let (typ, value): &(u64, Vec<u8>) = tlv;
163+
$crate::_encode_tlv!($stream, *typ, *value, required_vec);
164+
}
157165

158166
#[allow(unused_mut, unused_variables, unused_assignments)]
159167
#[cfg(debug_assertions)]
@@ -162,18 +170,8 @@ macro_rules! _encode_tlv_stream {
162170
$(
163171
$crate::_check_encoded_tlv_order!(last_seen, $type, $fieldty);
164172
)*
165-
}
166-
} };
167-
($stream: expr, $tlvs: expr) => { {
168-
for tlv in $tlvs {
169-
let (typ, value): &&(u64, Vec<u8>) = tlv;
170-
$crate::_encode_tlv!($stream, *typ, *value, required_vec);
171-
}
172-
173-
#[cfg(debug_assertions)] {
174-
let mut last_seen: Option<u64> = None;
175-
for tlv in $tlvs {
176-
let (typ, _): &&(u64, Vec<u8>) = tlv;
173+
for tlv in $extra_tlvs {
174+
let (typ, _): &(u64, Vec<u8>) = tlv;
177175
$crate::_check_encoded_tlv_order!(last_seen, *typ, required_vec);
178176
}
179177
}
@@ -246,14 +244,13 @@ macro_rules! _encode_varint_length_prefixed_tlv {
246244
$crate::_get_varint_length_prefixed_tlv_length!(len, $type, $field, $fieldty);
247245
)*
248246
for tlv in $extra_tlvs {
249-
let (typ, value): &&(u64, Vec<u8>) = tlv;
247+
let (typ, value): &(u64, Vec<u8>) = tlv;
250248
$crate::_get_varint_length_prefixed_tlv_length!(len, *typ, *value, required_vec);
251249
}
252250
len.0
253251
};
254252
BigSize(len as u64).write($stream)?;
255-
$crate::_encode_tlv_stream!($stream, { $(($type, $field, $fieldty)),* });
256-
$crate::_encode_tlv_stream!($stream, $extra_tlvs);
253+
$crate::_encode_tlv_stream!($stream, { $(($type, $field, $fieldty)),* }, $extra_tlvs);
257254
} };
258255
}
259256

@@ -580,6 +577,7 @@ macro_rules! _decode_tlv_stream_range {
580577
///
581578
/// For example,
582579
/// ```
580+
/// # use lightning::_encode_tlv_stream;
583581
/// # use lightning::impl_writeable_msg;
584582
/// struct MyCustomMessage {
585583
/// pub field_1: u32,

0 commit comments

Comments
 (0)