Skip to content

Commit 33919ee

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.
1 parent 6089f14 commit 33919ee

File tree

1 file changed

+38
-1
lines changed

1 file changed

+38
-1
lines changed

lightning/src/ln/onion_utils.rs

Lines changed: 38 additions & 1 deletion
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)