Skip to content

Commit 7e29b27

Browse files
committed
Assert that all onion error messages are correct len in tests
When we're constructing an HTLCFailReason, we should check that we set the data to at least the correct length for the given failure code, which we do here. Fixes #1879
1 parent 504726a commit 7e29b27

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

lightning/src/ln/onion_utils.rs

+38-1
Original file line numberDiff line numberDiff line change
@@ -642,11 +642,48 @@ impl_writeable_tlv_based_enum!(HTLCFailReasonRepr,
642642

643643
impl HTLCFailReason {
644644
pub(super) fn reason(failure_code: u16, data: Vec<u8>) -> Self {
645+
const BADONION: u16 = 0x8000;
646+
const PERM: u16 = 0x4000;
647+
const NODE: u16 = 0x2000;
648+
const UPDATE: u16 = 0x1000;
649+
650+
if failure_code == 1 | PERM { debug_assert!(data.is_empty()) }
651+
else if failure_code == 2 | NODE { debug_assert!(data.is_empty()) }
652+
else if failure_code == 3 | PERM | NODE { debug_assert!(data.is_empty()) }
653+
else if failure_code == 4 | BADONION | PERM { debug_assert_eq!(data.len(), 32) }
654+
else if failure_code == 5 | BADONION | PERM { debug_assert_eq!(data.len(), 32) }
655+
else if failure_code == 6 | BADONION | PERM { debug_assert_eq!(data.len(), 32) }
656+
else if failure_code == 7 | UPDATE {
657+
debug_assert_eq!(data.len() - 2, u16::from_be_bytes(data[0..2].try_into().unwrap()) as usize) }
658+
else if failure_code == 8 | PERM { debug_assert!(data.is_empty()) }
659+
else if failure_code == 9 | PERM { debug_assert!(data.is_empty()) }
660+
else if failure_code == 10 | PERM { debug_assert!(data.is_empty()) }
661+
else if failure_code == 11 | UPDATE {
662+
debug_assert_eq!(data.len() - 2, u16::from_be_bytes(data[8..10].try_into().unwrap()) as usize) }
663+
else if failure_code == 12 | UPDATE {
664+
debug_assert_eq!(data.len() - 2, u16::from_be_bytes(data[8..10].try_into().unwrap()) as usize) }
665+
else if failure_code == 13 | UPDATE {
666+
debug_assert_eq!(data.len() - 2, u16::from_be_bytes(data[4..6].try_into().unwrap()) as usize) }
667+
else if failure_code == 14 | UPDATE {
668+
debug_assert_eq!(data.len() - 2, u16::from_be_bytes(data[0..2].try_into().unwrap()) as usize) }
669+
else if failure_code == 15 | PERM { debug_assert_eq!(data.len(), 12) }
670+
else if failure_code == 18 { debug_assert_eq!(data.len(), 4) }
671+
else if failure_code == 19 { debug_assert_eq!(data.len(), 8) }
672+
else if failure_code == 20 | UPDATE {
673+
debug_assert_eq!(data.len() - 2, u16::from_be_bytes(data[2..4].try_into().unwrap()) as usize) }
674+
else if failure_code == 21 { debug_assert!(data.is_empty()) }
675+
else if failure_code == 22 | PERM { debug_assert!(data.len() <= 11) }
676+
else if failure_code == 23 { debug_assert!(data.is_empty()) }
677+
else if failure_code & BADONION != 0 {
678+
// We set some bogus BADONION failure codes in test, so ignore unknown ones.
679+
}
680+
else { debug_assert!(false, "Unknown failure code: {}", failure_code) }
681+
645682
Self(HTLCFailReasonRepr::Reason { failure_code, data })
646683
}
647684

648685
pub(super) fn from_failure_code(failure_code: u16) -> Self {
649-
Self(HTLCFailReasonRepr::Reason { failure_code, data: Vec::new() })
686+
Self::reason(failure_code, Vec::new())
650687
}
651688

652689
pub(super) fn from_msg(msg: &msgs::UpdateFailHTLC) -> Self {

0 commit comments

Comments
 (0)