Skip to content

Commit

Permalink
Fail incoming HTLCs sent after we start shutdown, not the chan
Browse files Browse the repository at this point in the history
  • Loading branch information
TheBlueMatt committed Nov 1, 2018
1 parent a11e27d commit 65f23de
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 2 deletions.
6 changes: 6 additions & 0 deletions src/ln/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1553,6 +1553,12 @@ impl Channel {

//TODO: Check msg.cltv_expiry further? Do this in channel manager?

if self.channel_state & ChannelState::LocalShutdownSent as u32 != 0 {
if let PendingHTLCStatus::Forward(_) = pending_forward_state {
panic!("ChannelManager shouldn't be trying to add a forwardable HTLC after we've started closing");
}
}

// Now update local state:
self.next_remote_htlc_id += 1;
self.pending_inbound_htlcs.push(InboundHTLCOutput {
Expand Down
13 changes: 11 additions & 2 deletions src/ln/channelmanager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1929,7 +1929,7 @@ impl ChannelManager {
//encrypted with the same key. Its not immediately obvious how to usefully exploit that,
//but we should prevent it anyway.

let (pending_forward_info, mut channel_state_lock) = self.decode_update_add_htlc_onion(msg);
let (mut pending_forward_info, mut channel_state_lock) = self.decode_update_add_htlc_onion(msg);
let channel_state = channel_state_lock.borrow_parts();

match channel_state.by_id.get_mut(&msg.channel_id) {
Expand All @@ -1939,7 +1939,16 @@ impl ChannelManager {
return Err(MsgHandleErrInternal::send_err_msg_no_close("Got a message for a channel from the wrong node!", msg.channel_id));
}
if !chan.is_usable() {
return Err(MsgHandleErrInternal::from_no_close(HandleError{err: "Channel not yet available for receiving HTLCs", action: Some(msgs::ErrorAction::IgnoreError)}));
// If the update_add is completely bogus, the channel will reject it outright,
// but if we've sent a shutdown but they haven't acknowledged it yet, we just
// want to reject the new HTLC.
if let PendingHTLCStatus::Forward(PendingForwardHTLCInfo { incoming_shared_secret, .. }) = pending_forward_info {
pending_forward_info = PendingHTLCStatus::Fail(HTLCFailureMsg::Relay(msgs::UpdateFailHTLC {
channel_id: msg.channel_id,
htlc_id: msg.htlc_id,
reason: ChannelManager::build_first_hop_failure_packet(&incoming_shared_secret, 0x1000|20, &self.get_channel_update(chan).unwrap().encode_with_len()[..]),
}));
}
}
chan.update_add_htlc(&msg, pending_forward_info).map_err(|e| MsgHandleErrInternal::from_maybe_close(e))
},
Expand Down

0 comments on commit 65f23de

Please sign in to comment.