From 25dbd0d7e09dac82ea80aa8df89615150cd105cc Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 21 Apr 2021 20:47:24 +0000 Subject: [PATCH] Correct Channel outbound HTLC serialization Channel serialization should happen "as if remove_uncommitted_htlcs_and_mark_paused had just been called". This is true for the most part, but outbound RemoteRemoved HTLCs were being serialized as normal, even though `remote_uncommitted_htlcs_and_mark_paused` resets them to `Committed`. This led to a bug identified by the `chanmon_consistency_target` fuzzer wherein, if we receive a update_*_htlc message bug not the corresponding commitment_signed prior to a serialization roundtrip, we'd force-close the channel due to the peer "attempting to fail/claim an HTLC which was already failed/claimed". --- lightning/src/ln/channel.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index dbc63c95..689f5e6b 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -4451,9 +4451,10 @@ impl Writeable for Channel { &OutboundHTLCState::Committed => { 1u8.write(writer)?; }, - &OutboundHTLCState::RemoteRemoved(ref fail_reason) => { - 2u8.write(writer)?; - fail_reason.write(writer)?; + &OutboundHTLCState::RemoteRemoved(_) => { + // Treat this as a Committed because we haven't received the CS - they'll + // resend the claim/fail on reconnect as we all (hopefully) the missing CS. + 1u8.write(writer)?; }, &OutboundHTLCState::AwaitingRemoteRevokeToRemove(ref fail_reason) => { 3u8.write(writer)?; -- 2.30.2