OMs: fix panic sending to a two-hop blinded route where we are the intro node
authorValentine Wallace <vwallace@protonmail.com>
Mon, 31 Oct 2022 16:40:06 +0000 (12:40 -0400)
committerValentine Wallace <vwallace@protonmail.com>
Mon, 31 Oct 2022 16:40:09 +0000 (12:40 -0400)
lightning/src/onion_message/functional_tests.rs
lightning/src/onion_message/messenger.rs

index 991f0d1c2650ab172a1d5e7c0bffb712f5b089c1..81826a62cc375cc9bf3f4fbf60dbe84406a1e008 100644 (file)
@@ -174,7 +174,7 @@ fn too_big_packet_error() {
 fn we_are_intro_node() {
        // If we are sending straight to a blinded route and we are the introduction node, we need to
        // advance the blinded route by 1 hop so the second hop is the new introduction node.
-       let nodes = create_nodes(3);
+       let mut nodes = create_nodes(3);
        let test_msg = TestCustomMessage {};
 
        let secp_ctx = Secp256k1::new();
@@ -182,6 +182,12 @@ fn we_are_intro_node() {
 
        nodes[0].messenger.send_onion_message(&[], Destination::BlindedRoute(blinded_route), OnionMessageContents::Custom(test_msg.clone()), None).unwrap();
        pass_along_path(&nodes, None);
+
+       // Try with a two-hop blinded route where we are the introduction node.
+       let blinded_route = BlindedRoute::new(&[nodes[0].get_node_pk(), nodes[1].get_node_pk()], &*nodes[1].keys_manager, &secp_ctx).unwrap();
+       nodes[0].messenger.send_onion_message(&[], Destination::BlindedRoute(blinded_route), OnionMessageContents::Custom(test_msg), None).unwrap();
+       nodes.remove(2);
+       pass_along_path(&nodes, None);
 }
 
 #[test]
index 4eb0ada38399a40da8fb2c3b7a29d3f05cec445f..70a0842c7710be9bf4ad86f4f6d76dd9be292322 100644 (file)
@@ -513,12 +513,8 @@ fn packet_payloads_and_keys<T: CustomOnionMessageContents, S: secp256k1::Signing
                                        next_blinding_override: Some(blinding_pt),
                                })), control_tlvs_ss));
                        }
-                       if let Some(encrypted_payload) = enc_payload_opt {
-                               payloads.push((Payload::Forward(ForwardControlTlvs::Blinded(encrypted_payload)),
-                                       control_tlvs_ss));
-                       } else { debug_assert!(false); }
-                       blinded_path_idx += 1;
-               } else if blinded_path_idx < num_blinded_hops - 1 && enc_payload_opt.is_some() {
+               }
+               if blinded_path_idx < num_blinded_hops.saturating_sub(1) && enc_payload_opt.is_some() {
                        payloads.push((Payload::Forward(ForwardControlTlvs::Blinded(enc_payload_opt.unwrap())),
                                control_tlvs_ss));
                        blinded_path_idx += 1;