Use WarnAndDisconnect to fail a splice
What changed, and why it matters
This tiny patch changes how one specific splicing failure is handled in a Lightning channel. Previously, when the local node's commitment point was not ready, the code only warned the peer. Now it also disconnects the peer. The goal is to take the channel out of a temporary 'quiet' (quiescent) state so it can be used for normal payments again. Without the disconnect, the channel could get stuck and be unable to process payments after a failed splice attempt. This is a reliability/availability fix rather than a direct theft-of-funds bug.
Treat as a low-to-moderate reliability fix. Review whether other ChannelError::Warn paths during splicing or quiescence could leave the channel stuck. No urgent security deployment is indicated, but node operators should update to avoid stuck channels after failed splice attempts.
Security signals we found
Channel state machine fix
Quiescence not cleared on failed splice
Availability degradation possible
No direct cryptographic or signature issue
Evidence from the diff
In lightning/src/ln/channel.rs, the error returned when holder_commitment_point.current_point() is None during splicing was changed from ChannelError::Warn to ChannelError::WarnAndDisconnect. The commit message explains that a splice puts the channel into quiescence; if the splice cannot proceed because the current commitment point is unavailable, the channel must be disconnected to exit quiescence. Otherwise the channel remains quiescent and cannot be used for payments. This is a state-machine hygiene fix.
Changed components
lightning/src/ln/channel.rsSplicing flowChannel quiescence handlingInspect captured patch +1 / −1
diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs
index fe2a150..4d8c9d0 100644
--- a/lightning/src/ln/channel.rs
+++ b/lightning/src/ln/channel.rs
@@ -10682,7 +10682,7 @@ where
// TODO(splicing): Add check that we are the quiescence acceptor
if self.holder_commitment_point.current_point().is_none() {
- return Err(ChannelError::Warn(format!(
+ return Err(ChannelError::WarnAndDisconnect(format!(
"Channel {} commitment point needs to be advanced once before spliced",
self.context.channel_id(),
)));
Why this scored 41/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.