Skip to content

Commit 0e098d4

Browse files
authored
Merge pull request #241 from TheBlueMatt/2018-10-peer-free-panic
Fix pre-noise outbound peer disconnect panic found by fuzzer
2 parents af89de3 + 38584e3 commit 0e098d4

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

fuzz/fuzz_targets/full_stack_target.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -209,15 +209,17 @@ impl<'a> MoneyLossDetector<'a> {
209209

210210
impl<'a> Drop for MoneyLossDetector<'a> {
211211
fn drop(&mut self) {
212-
// Disconnect all peers
213-
for (idx, peer) in self.peers.borrow().iter().enumerate() {
214-
if *peer {
215-
self.handler.disconnect_event(&Peer{id: idx as u8, peers_connected: &self.peers});
212+
if !::std::thread::panicking() {
213+
// Disconnect all peers
214+
for (idx, peer) in self.peers.borrow().iter().enumerate() {
215+
if *peer {
216+
self.handler.disconnect_event(&Peer{id: idx as u8, peers_connected: &self.peers});
217+
}
216218
}
217-
}
218219

219-
// Force all channels onto the chain (and time out claim txn)
220-
self.manager.force_close_all_channels();
220+
// Force all channels onto the chain (and time out claim txn)
221+
self.manager.force_close_all_channels();
222+
}
221223
}
222224
}
223225

src/ln/channelmanager.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2733,6 +2733,7 @@ impl ChannelMessageHandler for ChannelManager {
27332733
let short_to_id = channel_state.short_to_id;
27342734
let pending_msg_events = channel_state.pending_msg_events;
27352735
if no_connection_possible {
2736+
log_debug!(self, "Failing all channels with {} due to no_connection_possible", log_pubkey!(their_node_id));
27362737
channel_state.by_id.retain(|_, chan| {
27372738
if chan.get_their_node_id() == *their_node_id {
27382739
if let Some(short_id) = chan.get_short_channel_id() {
@@ -2750,6 +2751,7 @@ impl ChannelMessageHandler for ChannelManager {
27502751
}
27512752
});
27522753
} else {
2754+
log_debug!(self, "Marking channels with {} disconnected and generating channel_updates", log_pubkey!(their_node_id));
27532755
channel_state.by_id.retain(|_, chan| {
27542756
if chan.get_their_node_id() == *their_node_id {
27552757
//TODO: mark channel disabled (and maybe announce such after a timeout).
@@ -2780,6 +2782,8 @@ impl ChannelMessageHandler for ChannelManager {
27802782
}
27812783

27822784
fn peer_connected(&self, their_node_id: &PublicKey) {
2785+
log_debug!(self, "Generating channel_reestablish events for {}", log_pubkey!(their_node_id));
2786+
27832787
let _ = self.total_consistency_lock.read().unwrap();
27842788
let mut channel_state_lock = self.channel_state.lock().unwrap();
27852789
let channel_state = channel_state_lock.borrow_parts();

src/ln/peer_handler.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,9 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
359359

360360
macro_rules! try_potential_handleerror {
361361
($thing: expr) => {
362+
try_potential_handleerror!($thing, false);
363+
};
364+
($thing: expr, $pre_noise: expr) => {
362365
match $thing {
363366
Ok(x) => x,
364367
Err(e) => {
@@ -367,6 +370,9 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
367370
msgs::ErrorAction::DisconnectPeer { msg: _ } => {
368371
//TODO: Try to push msg
369372
log_trace!(self, "Got Err handling message, disconnecting peer because {}", e.err);
373+
if $pre_noise {
374+
peer.their_node_id = None; // Unset so that we don't generate a peer_disconnected event
375+
}
370376
return Err(PeerHandleError{ no_connection_possible: false });
371377
},
372378
msgs::ErrorAction::IgnoreError => {
@@ -417,23 +423,27 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
417423
() => {
418424
match peers.node_id_to_descriptor.entry(peer.their_node_id.unwrap()) {
419425
hash_map::Entry::Occupied(_) => {
426+
log_trace!(self, "Got second connection with {}, closing", log_pubkey!(peer.their_node_id.unwrap()));
420427
peer.their_node_id = None; // Unset so that we don't generate a peer_disconnected event
421428
return Err(PeerHandleError{ no_connection_possible: false })
422429
},
423-
hash_map::Entry::Vacant(entry) => entry.insert(peer_descriptor.clone()),
430+
hash_map::Entry::Vacant(entry) => {
431+
log_trace!(self, "Finished noise handshake for connection with {}", log_pubkey!(peer.their_node_id.unwrap()));
432+
entry.insert(peer_descriptor.clone())
433+
},
424434
};
425435
}
426436
}
427437

428438
let next_step = peer.channel_encryptor.get_noise_step();
429439
match next_step {
430440
NextNoiseStep::ActOne => {
431-
let act_two = try_potential_handleerror!(peer.channel_encryptor.process_act_one_with_key(&peer.pending_read_buffer[..], &self.our_node_secret)).to_vec();
441+
let act_two = try_potential_handleerror!(peer.channel_encryptor.process_act_one_with_key(&peer.pending_read_buffer[..], &self.our_node_secret), true).to_vec();
432442
peer.pending_outbound_buffer.push_back(act_two);
433443
peer.pending_read_buffer = [0; 66].to_vec(); // act three is 66 bytes long
434444
},
435445
NextNoiseStep::ActTwo => {
436-
let act_three = try_potential_handleerror!(peer.channel_encryptor.process_act_two(&peer.pending_read_buffer[..], &self.our_node_secret)).to_vec();
446+
let act_three = try_potential_handleerror!(peer.channel_encryptor.process_act_two(&peer.pending_read_buffer[..], &self.our_node_secret), true).to_vec();
437447
peer.pending_outbound_buffer.push_back(act_three);
438448
peer.pending_read_buffer = [0; 18].to_vec(); // Message length header is 18 bytes
439449
peer.pending_read_is_header = true;
@@ -450,7 +460,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
450460
}, 16);
451461
},
452462
NextNoiseStep::ActThree => {
453-
let their_node_id = try_potential_handleerror!(peer.channel_encryptor.process_act_three(&peer.pending_read_buffer[..]));
463+
let their_node_id = try_potential_handleerror!(peer.channel_encryptor.process_act_three(&peer.pending_read_buffer[..]), true);
454464
peer.pending_read_buffer = [0; 18].to_vec(); // Message length header is 18 bytes
455465
peer.pending_read_is_header = true;
456466
peer.their_node_id = Some(their_node_id);
@@ -477,6 +487,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
477487
log_trace!(self, "Received message of type {} from {}", msg_type, log_pubkey!(peer.their_node_id.unwrap()));
478488
if msg_type != 16 && peer.their_global_features.is_none() {
479489
// Need an init message as first message
490+
log_trace!(self, "Peer {} sent non-Init first message", log_pubkey!(peer.their_node_id.unwrap()));
480491
return Err(PeerHandleError{ no_connection_possible: false });
481492
}
482493
let mut reader = ::std::io::Cursor::new(&msg_data[2..]);

0 commit comments

Comments
 (0)