Skip to content

Commit bfaeedd

Browse files
Fix bug in onion message payload decode
Previously, we were decoding payload lengths as a VarInt. Per the spec, this is wrong -- it should be decoded as a BigSize. This bug also exists in our payment payload decoding, to be fixed separately. Upcoming reply path tests caught this bug because we hadn't encoded a payload greater than 253 before, so we hadn't hit the problem that VarInts are encoded as little-endian whereas BigSizes are encoded as big-endian.
1 parent 866d7d7 commit bfaeedd

File tree

1 file changed

+2
-8
lines changed

1 file changed

+2
-8
lines changed

lightning/src/onion_message/packet.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use ln::msgs::DecodeError;
1616
use ln::onion_utils;
1717
use super::blinded_route::{ForwardTlvs, ReceiveTlvs};
1818
use util::chacha20poly1305rfc::{ChaChaPolyReadAdapter, ChaChaPolyWriteAdapter};
19-
use util::ser::{FixedLengthReader, LengthRead, LengthReadable, LengthReadableArgs, Readable, ReadableArgs, Writeable, Writer};
19+
use util::ser::{BigSize, FixedLengthReader, LengthRead, LengthReadable, LengthReadableArgs, Readable, ReadableArgs, Writeable, Writer};
2020

2121
use core::cmp;
2222
use io::{self, Read};
@@ -161,13 +161,7 @@ impl Writeable for (Payload, [u8; 32]) {
161161
// Uses the provided secret to simultaneously decode and decrypt the control TLVs.
162162
impl ReadableArgs<SharedSecret> for Payload {
163163
fn read<R: Read>(mut r: &mut R, encrypted_tlvs_ss: SharedSecret) -> Result<Self, DecodeError> {
164-
use bitcoin::consensus::encode::{Decodable, Error, VarInt};
165-
let v: VarInt = Decodable::consensus_decode(&mut r)
166-
.map_err(|e| match e {
167-
Error::Io(ioe) => DecodeError::from(ioe),
168-
_ => DecodeError::InvalidValue
169-
})?;
170-
164+
let v: BigSize = Readable::read(r)?;
171165
let mut rd = FixedLengthReader::new(r, v.0);
172166
// TODO: support reply paths
173167
let mut _reply_path_bytes: Option<Vec<u8>> = Some(Vec::new());

0 commit comments

Comments
 (0)