Skip to content

Commit 48e0c43

Browse files
author
Antoine Riard
committed
Implement ErrorMessage msg and ErrorAction::SendErrorMessage + fuzz test
1 parent 48b0d99 commit 48e0c43

File tree

4 files changed

+92
-1
lines changed

4 files changed

+92
-1
lines changed

fuzz/fuzz_targets/msg_targets/gen_target.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
for target in CommitmentSigned FundingCreated FundingLocked FundingSigned OpenChannel RevokeAndACK Shutdown UpdateAddHTLC UpdateFailHTLC UpdateFailMalformedHTLC UpdateFee UpdateFulfillHTLC AcceptChannel ClosingSigned; do
1+
for target in CommitmentSigned FundingCreated FundingLocked FundingSigned OpenChannel RevokeAndACK Shutdown UpdateAddHTLC UpdateFailHTLC UpdateFailMalformedHTLC UpdateFee UpdateFulfillHTLC AcceptChannel ClosingSigned ErrorMessage; do
22
tn=$(echo $target | sed 's/\([a-z0-9]\)\([A-Z]\)/\1_\L\2/g')
33
fn=msg_$(echo $tn | tr '[:upper:]' '[:lower:]')_target.rs
44
cat msg_target_template.txt | sed s/MSG_TARGET/$target/ > $fn
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
// This file is auto-generated by gen_target.sh based on msg_target_template.txt
2+
// To modify it, modify msg_target_template.txt and run gen_target.sh instead.
3+
4+
extern crate lightning;
5+
6+
use lightning::ln::msgs;
7+
use lightning::util::reset_rng_state;
8+
9+
use lightning::ln::msgs::{MsgEncodable, MsgDecodable};
10+
11+
mod utils;
12+
13+
#[inline]
14+
pub fn do_test(data: &[u8]) {
15+
reset_rng_state();
16+
test_msg!(msgs::ErrorMessage, data);
17+
}
18+
19+
#[cfg(feature = "afl")]
20+
extern crate afl;
21+
#[cfg(feature = "afl")]
22+
fn main() {
23+
afl::read_stdio_bytes(|data| {
24+
do_test(&data);
25+
});
26+
}
27+
28+
#[cfg(feature = "honggfuzz")]
29+
#[macro_use] extern crate honggfuzz;
30+
#[cfg(feature = "honggfuzz")]
31+
fn main() {
32+
loop {
33+
fuzz!(|data| {
34+
do_test(data);
35+
});
36+
}
37+
}
38+
39+
#[cfg(test)]
40+
mod tests {
41+
use utils::extend_vec_from_hex;
42+
#[test]
43+
fn duplicate_crash() {
44+
let mut a = Vec::new();
45+
extend_vec_from_hex("00", &mut a);
46+
super::do_test(&a);
47+
}
48+
}

src/ln/msgs.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,11 @@ pub struct Init {
139139
pub local_features: LocalFeatures,
140140
}
141141

142+
pub struct ErrorMessage {
143+
pub channel_id: Uint256,
144+
pub data: String,
145+
}
146+
142147
pub struct Ping {
143148
pub ponglen: u16,
144149
pub byteslen: u16,
@@ -376,6 +381,10 @@ pub enum ErrorAction {
376381
DisconnectPeer,
377382
/// The peer did something harmless that we weren't able to process, just log and ignore
378383
IgnoreError,
384+
/// The peer did something incorrect. Tell them.
385+
SendErrorMessage {
386+
msg: ErrorMessage
387+
},
379388
}
380389

381390
pub struct HandleError { //TODO: rename me
@@ -1534,3 +1543,33 @@ impl MsgEncodable for OnionErrorPacket {
15341543
res
15351544
}
15361545
}
1546+
1547+
impl MsgEncodable for ErrorMessage {
1548+
fn encode(&self) -> Vec<u8> {
1549+
let mut res = Vec::with_capacity(34 + self.data.len());
1550+
res.extend_from_slice(&serialize(&self.channel_id).unwrap()[..]);
1551+
res.extend_from_slice(&byte_utils::be16_to_array(self.data.len() as u16));
1552+
res.extend_from_slice(&self.data.as_bytes());
1553+
res
1554+
}
1555+
}
1556+
1557+
impl MsgDecodable for ErrorMessage {
1558+
fn decode(v: &[u8]) -> Result<Self,DecodeError> {
1559+
if v.len() < 34 {
1560+
return Err(DecodeError::WrongLength);
1561+
}
1562+
let len = byte_utils::slice_to_be16(&v[33..34]);
1563+
let mut data = String::new();
1564+
if len > 0 {
1565+
data = String::from_utf8(v[35..len as usize].to_vec()).unwrap();
1566+
if len != data.len() as u16 {
1567+
return Err(DecodeError::WrongLength);
1568+
}
1569+
}
1570+
Ok(Self {
1571+
channel_id: deserialize(&v[..34]).unwrap(),
1572+
data: data,
1573+
})
1574+
}
1575+
}

src/ln/peer_handler.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,10 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
293293
msgs::ErrorAction::IgnoreError => {
294294
continue;
295295
},
296+
msgs::ErrorAction::SendErrorMessage { msg } => {
297+
encode_and_send_msg!(msg, 17);
298+
continue;
299+
},
296300
}
297301
} else {
298302
return Err(PeerHandleError{ no_connection_possible: false });

0 commit comments

Comments
 (0)