Fix bogus Event::PaymentSent serialization

`Event::PaymentSent` serialization has a bug where we
double-serialize the payment_preimage field but do not attempt to
read it twice. This results in a failure to read `ChannelManager`s
from disk if we have a pending `Event::PaymentSent` pending
awaiting handling when we serialize.

Instead of attempting to read both versions, we opt to simply fix
the serialization, assuming it is exceedingly rare for such a
scenario to appear (and if it does, we can assist in manual
recovery).

The release notes have been updated to note this inconsistency.

Found by the chanmon_consistency fuzz target.
This commit is contained in:
Matt Corallo 2021-06-28 23:31:29 +00:00
parent ecddfe1766
commit dec7ec191e
2 changed files with 10 additions and 1 deletions

View file

@ -1,3 +1,13 @@
# 0.0.99 - WIP
## Serialization Compatibility
* Due to a bug discovered in 0.0.98, if a `ChannelManager` is serialized on
version 0.0.98 while an `Event::PaymentSent` is pending processing, the
`ChannelManager` will fail to deserialize both on version 0.0.98 and later
versions. If you have such a `ChannelManager` available, a simple patch will
allow it to deserialize, please file an issue if you need assistance.
# 0.0.98 - 2021-06-11 # 0.0.98 - 2021-06-11
0.0.98 should be considered a release candidate to the first alpha release of 0.0.98 should be considered a release candidate to the first alpha release of

View file

@ -160,7 +160,6 @@ impl Writeable for Event {
write_tlv_fields!(writer, { write_tlv_fields!(writer, {
(0, payment_preimage, required), (0, payment_preimage, required),
}); });
payment_preimage.write(writer)?;
}, },
&Event::PaymentFailed { ref payment_hash, ref rejected_by_dest, &Event::PaymentFailed { ref payment_hash, ref rejected_by_dest,
#[cfg(test)] #[cfg(test)]