Update error deserialization in compliance with BOLT #1

This commit is contained in:
Matt Corallo 2018-08-25 15:03:59 -04:00
parent a3247abb4e
commit 755b76bf83
4 changed files with 14 additions and 14 deletions

View file

@ -60,6 +60,10 @@ path = "fuzz_targets/msg_ping_target.rs"
name = "msg_pong_target"
path = "fuzz_targets/msg_pong_target.rs"
[[bin]]
name = "msg_error_message_target"
path = "fuzz_targets/msg_error_message_target.rs"
[[bin]]
name = "msg_accept_channel_target"
path = "fuzz_targets/msg_targets/msg_accept_channel_target.rs"
@ -119,7 +123,3 @@ path = "fuzz_targets/msg_targets/msg_update_fail_htlc_target.rs"
[[bin]]
name = "msg_channel_reestablish_target"
path = "fuzz_targets/msg_targets/msg_channel_reestablish_target.rs"
[[bin]]
name = "msg_error_message_target"
path = "fuzz_targets/msg_targets/msg_error_message_target.rs"

View file

@ -8,12 +8,14 @@ use lightning::util::reset_rng_state;
use lightning::ln::msgs::{MsgEncodable, MsgDecodable};
mod utils;
#[inline]
pub fn do_test(data: &[u8]) {
reset_rng_state();
test_msg!(msgs::ErrorMessage, data);
if let Ok(msg) = msgs::ErrorMessage::decode(data){
let enc = msg.encode();
assert_eq!(&data[0..32], &enc[0..32]);
assert_eq!(&data[34..enc.len()], &enc[34..]);
}
}
#[cfg(feature = "afl")]

View file

@ -1,4 +1,4 @@
for target in CommitmentSigned FundingCreated FundingLocked FundingSigned OpenChannel RevokeAndACK Shutdown UpdateAddHTLC UpdateFailHTLC UpdateFailMalformedHTLC UpdateFee UpdateFulfillHTLC AcceptChannel ClosingSigned ChannelReestablish ErrorMessage; do
for target in CommitmentSigned FundingCreated FundingLocked FundingSigned OpenChannel RevokeAndACK Shutdown UpdateAddHTLC UpdateFailHTLC UpdateFailMalformedHTLC UpdateFee UpdateFulfillHTLC AcceptChannel ClosingSigned ChannelReestablish; do
tn=$(echo $target | sed 's/\([a-z0-9]\)\([A-Z]\)/\1_\2/g')
fn=msg_$(echo $tn | tr '[:upper:]' '[:lower:]')_target.rs
cat msg_target_template.txt | sed s/MSG_TARGET/$target/ > $fn

View file

@ -5,7 +5,7 @@ use bitcoin::network::serialize::{deserialize,serialize};
use bitcoin::blockdata::script::Script;
use std::error::Error;
use std::fmt;
use std::{cmp, fmt};
use std::result::Result;
use util::{byte_utils, internal_traits, events};
@ -1626,11 +1626,9 @@ impl MsgDecodable for ErrorMessage {
if v.len() < 34 {
return Err(DecodeError::ShortRead);
}
let len = byte_utils::slice_to_be16(&v[32..34]);
if v.len() < 34 + len as usize {
return Err(DecodeError::ShortRead);
}
let data = match String::from_utf8(v[34..34 + len as usize].to_vec()) {
// Unlike most messages, BOLT 1 requires we truncate our read if the value is out of range
let len = cmp::min(byte_utils::slice_to_be16(&v[32..34]) as usize, v.len() - 34);
let data = match String::from_utf8(v[34..34 + len].to_vec()) {
Ok(s) => s,
Err(_) => return Err(DecodeError::BadText),
};