From: Matt Corallo Date: Fri, 7 Jan 2022 20:11:31 +0000 (+0000) Subject: Rely on Error/Warning message data lengths being correct X-Git-Tag: v0.0.105~41^2 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=refs%2Fheads%2F2021-07-warning-msgs;p=rust-lightning Rely on Error/Warning message data lengths being correct In https://github.com/lightning/bolts/pull/950, the (somewhat strange) requirement that error messages be handled even if the length field is set larger than the size of the package was removed. Here we change the code to drop the special handling for this, opting to just fail to read the message if the length is incorrect. --- diff --git a/lightning/src/ln/msgs.rs b/lightning/src/ln/msgs.rs index 6c04636a4..9007f3f2e 100644 --- a/lightning/src/ln/msgs.rs +++ b/lightning/src/ln/msgs.rs @@ -33,7 +33,7 @@ use bitcoin::hash_types::{Txid, BlockHash}; use ln::features::{ChannelFeatures, ChannelTypeFeatures, InitFeatures, NodeFeatures}; use prelude::*; -use core::{cmp, fmt}; +use core::fmt; use core::fmt::Debug; use io::{self, Read}; use io_extras::read_to_end; @@ -1529,10 +1529,11 @@ impl Readable for ErrorMessage { Ok(Self { channel_id: Readable::read(r)?, data: { - let mut sz: usize = ::read(r)? as usize; - let data = read_to_end(r)?; - sz = cmp::min(data.len(), sz); - match String::from_utf8(data[..sz as usize].to_vec()) { + let sz: usize = ::read(r)? as usize; + let mut data = Vec::with_capacity(sz); + data.resize(sz, 0); + r.read_exact(&mut data)?; + match String::from_utf8(data) { Ok(s) => s, Err(_) => return Err(DecodeError::InvalidValue), } @@ -1555,10 +1556,11 @@ impl Readable for WarningMessage { Ok(Self { channel_id: Readable::read(r)?, data: { - let mut sz: usize = ::read(r)? as usize; - let data = read_to_end(r)?; - sz = cmp::min(data.len(), sz); - match String::from_utf8(data[..sz as usize].to_vec()) { + let sz: usize = ::read(r)? as usize; + let mut data = Vec::with_capacity(sz); + data.resize(sz, 0); + r.read_exact(&mut data)?; + match String::from_utf8(data) { Ok(s) => s, Err(_) => return Err(DecodeError::InvalidValue), }