Fix regression when reading `Event::PaymentReceived` in some cases 2021-11-chanman-read-regression
authorMatt Corallo <git@bluematt.me>
Mon, 29 Nov 2021 20:05:35 +0000 (20:05 +0000)
committerMatt Corallo <git@bluematt.me>
Mon, 29 Nov 2021 21:03:12 +0000 (21:03 +0000)
For some reason rustc was deciding on a type for the `Option` being
deserialized for us as `_user_payment_id`. This really, really,
absolutely should have been a compile failure - the type (with
methods called on it!) was ambiguous! Instead, rustc seems to have
been defaulting to `Option<()>`, causing us to read zero of the
eight bytes in the `user_payment_id` field, which returns an
`Err(InvalidValue)` error as TLVs must always be read fully.

This should likely be reported to rustc as its definitely a bug,
but I cannot seem to cause the same error on any kinda of
vaguely-minimized version of the same code.

Found by `chanmon_consistency` fuzz target.

lightning/src/util/events.rs

index e90f443b0c2c42c1126bf4eb9805def24d4cf5bb..46ab9f74924e453b5446c27a783616cab0a0ff5d 100644 (file)
@@ -476,7 +476,7 @@ impl MaybeReadable for Event {
                                        let mut payment_preimage = None;
                                        let mut payment_secret = None;
                                        let mut amt = 0;
-                                       let mut _user_payment_id = None; // For compatibility with 0.0.103 and earlier
+                                       let mut _user_payment_id = None::<u64>; // For compatibility with 0.0.103 and earlier
                                        read_tlv_fields!(reader, {
                                                (0, payment_hash, required),
                                                (2, payment_secret, option),