From: Valentine Wallace Date: Wed, 23 Nov 2022 00:15:56 +0000 (-0500) Subject: Don't forward HTLC intercepts over unestablished channels X-Git-Tag: v0.0.113~22^2 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=acff8f6353184211791e4049ce588fa935308467;p=rust-lightning Don't forward HTLC intercepts over unestablished channels --- diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index f27ca53bc..20014f799 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -3078,7 +3078,14 @@ impl ChannelManager chan.get_short_channel_id().unwrap_or(chan.outbound_scid_alias()), + Some(chan) => { + if !chan.is_usable() { + return Err(APIError::APIMisuseError { + err: format!("Channel with id {:?} not fully established", next_hop_channel_id) + }) + } + chan.get_short_channel_id().unwrap_or(chan.outbound_scid_alias()) + }, None => return Err(APIError::APIMisuseError { err: format!("Channel with id {:?} not found", next_hop_channel_id) }) diff --git a/lightning/src/ln/payment_tests.rs b/lightning/src/ln/payment_tests.rs index ead5bcbd4..2da80ae3f 100644 --- a/lightning/src/ln/payment_tests.rs +++ b/lightning/src/ln/payment_tests.rs @@ -1487,6 +1487,12 @@ fn do_test_intercepted_payment(test: InterceptTest) { .expected_htlc_error_data(0x4000 | 10, &[]); expect_payment_failed_conditions(&nodes[0], payment_hash, false, fail_conditions); } else if test == InterceptTest::Forward { + // Check that we'll fail as expected when sending to a channel that isn't in `ChannelReady` yet. + let temp_chan_id = nodes[1].node.create_channel(nodes[2].node.get_our_node_id(), 100_000, 0, 42, None).unwrap(); + let unusable_chan_err = nodes[1].node.forward_intercepted_htlc(intercept_id, &temp_chan_id, nodes[2].node.get_our_node_id(), expected_outbound_amount_msat).unwrap_err(); + assert_eq!(unusable_chan_err , APIError::APIMisuseError { err: format!("Channel with id {:?} not fully established", temp_chan_id) }); + assert_eq!(nodes[1].node.get_and_clear_pending_msg_events().len(), 1); + // Open the just-in-time channel so the payment can then be forwarded. let (_, channel_id) = open_zero_conf_channel(&nodes[1], &nodes[2], None);