Skip to content

Commit 03a72f1

Browse files
committed
Makes ChannelManager::force_close_channel fail for unknown chan_ids
ChannelManager::force_close_channel does not fail if a non-existing channel id is being passed, making it hard to catch from an API point of view. Makes force_close_channel return in the same way close_channel does so the user calling the method with an unknown id can be warned.
1 parent d529a88 commit 03a72f1

File tree

5 files changed

+18
-16
lines changed

5 files changed

+18
-16
lines changed

fuzz/src/full_stack.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
548548
let channel_id = get_slice!(1)[0] as usize;
549549
if channel_id >= channels.len() { return; }
550550
channels.sort_by(|a, b| { a.channel_id.cmp(&b.channel_id) });
551-
channelmanager.force_close_channel(&channels[channel_id].channel_id);
551+
channelmanager.force_close_channel(&channels[channel_id].channel_id).unwrap();
552552
},
553553
// 15 is above
554554
_ => return,

lightning-persister/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ mod tests {
240240

241241
// Force close because cooperative close doesn't result in any persisted
242242
// updates.
243-
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id);
243+
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id).unwrap();
244244
check_closed_broadcast!(nodes[0], false);
245245
check_added_monitors!(nodes[0], 1);
246246

@@ -354,7 +354,7 @@ mod tests {
354354
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
355355
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
356356
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
357-
nodes[1].node.force_close_channel(&chan.2);
357+
nodes[1].node.force_close_channel(&chan.2).unwrap();
358358
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
359359

360360
// Set the persister's directory to read-only, which should result in
@@ -390,7 +390,7 @@ mod tests {
390390
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
391391
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
392392
let chan = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
393-
nodes[1].node.force_close_channel(&chan.2);
393+
nodes[1].node.force_close_channel(&chan.2).unwrap();
394394
let mut added_monitors = nodes[1].chain_monitor.added_monitors.lock().unwrap();
395395

396396
// Create the persister with an invalid directory name and test that the

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool, persister_fail
239239
}
240240

241241
// ...and make sure we can force-close a frozen channel
242-
nodes[0].node.force_close_channel(&channel_id);
242+
nodes[0].node.force_close_channel(&channel_id).unwrap();
243243
check_added_monitors!(nodes[0], 1);
244244
check_closed_broadcast!(nodes[0], false);
245245

lightning/src/ln/channelmanager.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -917,8 +917,8 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
917917
}
918918

919919
/// Force closes a channel, immediately broadcasting the latest local commitment transaction to
920-
/// the chain and rejecting new HTLCs on the given channel.
921-
pub fn force_close_channel(&self, channel_id: &[u8; 32]) {
920+
/// the chain and rejecting new HTLCs on the given channel. Fails if channel_id is unknown to the manager.
921+
pub fn force_close_channel(&self, channel_id: &[u8; 32]) -> Result<(), APIError>{
922922
let _consistency_lock = self.total_consistency_lock.read().unwrap();
923923

924924
let mut chan = {
@@ -930,7 +930,7 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
930930
}
931931
chan
932932
} else {
933-
return;
933+
return Err(APIError::ChannelUnavailable{err: "No such channel".to_owned()});
934934
}
935935
};
936936
log_trace!(self.logger, "Force-closing channel {}", log_bytes!(channel_id[..]));
@@ -941,13 +941,15 @@ impl<ChanSigner: ChannelKeys, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref>
941941
msg: update
942942
});
943943
}
944+
945+
Ok(())
944946
}
945947

946948
/// Force close all channels, immediately broadcasting the latest local commitment transaction
947949
/// for each to the chain and rejecting new HTLCs on each.
948950
pub fn force_close_all_channels(&self) {
949951
for chan in self.list_channels() {
950-
self.force_close_channel(&chan.channel_id);
952+
let _ = self.force_close_channel(&chan.channel_id);
951953
}
952954
}
953955

@@ -3471,11 +3473,11 @@ impl<ChanSigner: ChannelKeys, M: Deref + Sync + Send, T: Deref + Sync + Send, K:
34713473
if msg.channel_id == [0; 32] {
34723474
for chan in self.list_channels() {
34733475
if chan.remote_network_id == *counterparty_node_id {
3474-
self.force_close_channel(&chan.channel_id);
3476+
let _ = self.force_close_channel(&msg.channel_id);
34753477
}
34763478
}
34773479
} else {
3478-
self.force_close_channel(&msg.channel_id);
3480+
let _ = self.force_close_channel(&msg.channel_id);
34793481
}
34803482
}
34813483
}

lightning/src/ln/functional_tests.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3396,7 +3396,7 @@ fn test_htlc_ignore_latest_remote_commitment() {
33963396
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
33973397

33983398
route_payment(&nodes[0], &[&nodes[1]], 10000000);
3399-
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id);
3399+
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id).unwrap();
34003400
check_closed_broadcast!(nodes[0], false);
34013401
check_added_monitors!(nodes[0], 1);
34023402

@@ -3457,7 +3457,7 @@ fn test_force_close_fail_back() {
34573457
// state or updated nodes[1]' state. Now force-close and broadcast that commitment/HTLC
34583458
// transaction and ensure nodes[1] doesn't fail-backwards (this was originally a bug!).
34593459

3460-
nodes[2].node.force_close_channel(&payment_event.commitment_msg.channel_id);
3460+
nodes[2].node.force_close_channel(&payment_event.commitment_msg.channel_id).unwrap();
34613461
check_closed_broadcast!(nodes[2], false);
34623462
check_added_monitors!(nodes[2], 1);
34633463
let tx = {
@@ -4783,7 +4783,7 @@ fn test_claim_sizeable_push_msat() {
47834783
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
47844784

47854785
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 99000000, InitFeatures::known(), InitFeatures::known());
4786-
nodes[1].node.force_close_channel(&chan.2);
4786+
nodes[1].node.force_close_channel(&chan.2).unwrap();
47874787
check_closed_broadcast!(nodes[1], false);
47884788
check_added_monitors!(nodes[1], 1);
47894789
let node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
@@ -4810,7 +4810,7 @@ fn test_claim_on_remote_sizeable_push_msat() {
48104810
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
48114811

48124812
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 100000, 99000000, InitFeatures::known(), InitFeatures::known());
4813-
nodes[0].node.force_close_channel(&chan.2);
4813+
nodes[0].node.force_close_channel(&chan.2).unwrap();
48144814
check_closed_broadcast!(nodes[0], false);
48154815
check_added_monitors!(nodes[0], 1);
48164816

@@ -8544,7 +8544,7 @@ fn do_test_onchain_htlc_settlement_after_close(broadcast_alice: bool, go_onchain
85448544
// responds by (1) broadcasting a channel update and (2) adding a new ChannelMonitor.
85458545
let mut force_closing_node = 0; // Alice force-closes
85468546
if !broadcast_alice { force_closing_node = 1; } // Bob force-closes
8547-
nodes[force_closing_node].node.force_close_channel(&chan_ab.2);
8547+
nodes[force_closing_node].node.force_close_channel(&chan_ab.2).unwrap();
85488548
check_closed_broadcast!(nodes[force_closing_node], false);
85498549
check_added_monitors!(nodes[force_closing_node], 1);
85508550
if go_onchain_before_fulfill {

0 commit comments

Comments
 (0)