From: Matt Corallo Date: Wed, 21 Apr 2021 20:47:24 +0000 (+0000) Subject: Correct Channel outbound HTLC serialization X-Git-Tag: v0.0.98~10^2 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=refs%2Fheads%2F2021-04-fix-htlc-ser;p=rust-lightning 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". --- diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index dbc63c957..689f5e6b5 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)?;