From 6d6ffd4cabb04eb503ae6f8298a9af3e03e89ac7 Mon Sep 17 00:00:00 2001 From: Elias Rohrer Date: Thu, 14 Jul 2022 11:13:03 +0200 Subject: [PATCH] Also ignore deser fails for `NodeAnnouncementInfo` --- lightning/src/routing/gossip.rs | 71 +++++++++++++++++++++++++-------- 1 file changed, 54 insertions(+), 17 deletions(-) diff --git a/lightning/src/routing/gossip.rs b/lightning/src/routing/gossip.rs index e3f370c11c4..7b299fb970d 100644 --- a/lightning/src/routing/gossip.rs +++ b/lightning/src/routing/gossip.rs @@ -643,18 +643,6 @@ impl Writeable for ChannelUpdateInfo { } } -struct ChannelUpdateInfoDeserWrap(Option); - -impl MaybeReadable for ChannelUpdateInfoDeserWrap { - fn read(reader: &mut R) -> Result, DecodeError> { - if let Ok(channel_update_option) = ::util::ser::Readable::read(reader) { - Ok(Some(Self(channel_update_option))) - } else { - Ok(None) - } - } -} - impl Readable for ChannelUpdateInfo { fn read(reader: &mut R) -> Result { init_tlv_field_var!(last_update, required); @@ -784,6 +772,18 @@ impl Writeable for ChannelInfo { } } +struct ChannelUpdateInfoDeserWrap(Option); + +impl MaybeReadable for ChannelUpdateInfoDeserWrap { + fn read(reader: &mut R) -> Result, DecodeError> { + if let Ok(channel_update_option) = ::util::ser::Readable::read(reader) { + Ok(Some(Self(channel_update_option))) + } else { + Ok(None) + } + } +} + impl Readable for ChannelInfo { fn read(reader: &mut R) -> Result { init_tlv_field_var!(features, required); @@ -1085,11 +1085,48 @@ impl fmt::Display for NodeInfo { } } -impl_writeable_tlv_based!(NodeInfo, { - (0, lowest_inbound_channel_fees, option), - (2, announcement_info, option), - (4, channels, vec_type), -}); +impl Writeable for NodeInfo { + fn write(&self, writer: &mut W) -> Result<(), io::Error> { + write_tlv_fields!(writer, { + (0, self.lowest_inbound_channel_fees, option), + (2, self.announcement_info, option), + (4, self.channels, vec_type), + }); + Ok(()) + } +} + +struct NodeAnnouncementInfoDeserWrap(NodeAnnouncementInfo); + +impl MaybeReadable for NodeAnnouncementInfoDeserWrap { + fn read(reader: &mut R) -> Result, DecodeError> { + if let Ok(node_announcement) = ::util::ser::Readable::read(reader) { + Ok(Some(Self(node_announcement))) + } else { + Ok(None) + } + } +} + +impl Readable for NodeInfo { + fn read(reader: &mut R) -> Result { + init_tlv_field_var!(lowest_inbound_channel_fees, option); + let mut announcement_info_wrap: Option = None; + init_tlv_field_var!(channels, vec_type); + + read_tlv_fields!(reader, { + (0, lowest_inbound_channel_fees, option), + (2, announcement_info_wrap, ignorable), + (4, channels, vec_type), + }); + + Ok(NodeInfo { + lowest_inbound_channel_fees: init_tlv_based_struct_field!(lowest_inbound_channel_fees, option), + announcement_info: announcement_info_wrap.map(|w| w.0), + channels: init_tlv_based_struct_field!(channels, vec_type), + }) + } +} const SERIALIZATION_VERSION: u8 = 1; const MIN_SERIALIZATION_VERSION: u8 = 1;