Refuse to deserialize OnionHopDatas with values > 21 million
authorMatt Corallo <git@bluematt.me>
Thu, 2 Jan 2020 02:13:48 +0000 (21:13 -0500)
committerMatt Corallo <git@bluematt.me>
Sat, 25 Jan 2020 22:12:08 +0000 (17:12 -0500)
We should probably do this for all values (and define a newtype
for msat values), but this will do for now.

lightning/src/ln/msgs.rs

index 5036d0db5c0a8c50a1395324ee10c10f877fabe6..e0e37295b2dc352ed04a0d2ce20d282f9f1e63c1 100644 (file)
@@ -33,6 +33,9 @@ use util::ser::{Readable, Writeable, Writer, FixedLengthReader};
 
 use ln::channelmanager::{PaymentPreimage, PaymentHash};
 
+/// 21 million * 10^8 * 1000
+pub(crate) const MAX_VALUE_MSAT: u64 = 21_000_000_0000_0000_000;
+
 /// An error in decoding a message or struct.
 #[derive(Debug)]
 pub enum DecodeError {
@@ -1095,6 +1098,11 @@ impl<R: Read> Readable<R> for OnionHopData {
                                        short_channel_id,
                                }
                        } else {
+                               if let &Some(ref data) = &payment_data {
+                                       if data.total_msat > MAX_VALUE_MSAT {
+                                               return Err(DecodeError::InvalidValue);
+                                       }
+                               }
                                OnionHopDataFormat::FinalNode {
                                        payment_data
                                }
@@ -1106,6 +1114,9 @@ impl<R: Read> Readable<R> for OnionHopData {
                        };
                        let amt: u64 = Readable::read(r)?;
                        let cltv_value: u32 = Readable::read(r)?;
+                       if amt > MAX_VALUE_MSAT {
+                               return Err(DecodeError::InvalidValue);
+                       }
                        r.read_exact(&mut [0; 12])?;
                        (format, amt, cltv_value)
                };