Skip to content

Commit b4fc5b6

Browse files
committed
Fix pre-noise peer disconnect panic on non-Err disconnect
366e796 fixed the same crash for Errs that come up during handshake, but was incomplete and should have just dropped the node_id being different based on inbound/outbound. This patch does so and actually fixes the issue. Found by fuzzer.
1 parent b14baa0 commit b4fc5b6

File tree

2 files changed

+10
-15
lines changed

2 files changed

+10
-15
lines changed

src/ln/peer_channel_encryptor.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ impl PeerChannelEncryptor {
279279
self.process_act_one_with_ephemeral_key(act_one, our_node_secret, our_ephemeral_key)
280280
}
281281

282-
pub fn process_act_two(&mut self, act_two: &[u8], our_node_secret: &SecretKey) -> Result<[u8; 66], HandleError> {
282+
pub fn process_act_two(&mut self, act_two: &[u8], our_node_secret: &SecretKey) -> Result<([u8; 66], PublicKey), HandleError> {
283283
assert_eq!(act_two.len(), 50);
284284

285285
let mut final_hkdf = [0; 64];
@@ -334,7 +334,7 @@ impl PeerChannelEncryptor {
334334
rck: ck,
335335
};
336336

337-
Ok(res)
337+
Ok((res, self.their_node_id.unwrap().clone()))
338338
}
339339

340340
pub fn process_act_three(&mut self, act_three: &[u8]) -> Result<PublicKey, HandleError> {
@@ -537,7 +537,7 @@ mod tests {
537537
let mut outbound_peer = get_outbound_peer_for_initiator_test_vectors();
538538

539539
let act_two = hex::decode("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap().to_vec();
540-
assert_eq!(outbound_peer.process_act_two(&act_two[..], &our_node_id).unwrap()[..], hex::decode("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap()[..]);
540+
assert_eq!(outbound_peer.process_act_two(&act_two[..], &our_node_id).unwrap().0[..], hex::decode("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap()[..]);
541541

542542
match outbound_peer.noise_state {
543543
NoiseState::Finished { sk, sn, sck, rk, rn, rck } => {
@@ -694,7 +694,7 @@ mod tests {
694694
let our_node_id = SecretKey::from_slice(&secp_ctx, &hex::decode("1111111111111111111111111111111111111111111111111111111111111111").unwrap()[..]).unwrap();
695695

696696
let act_two = hex::decode("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap().to_vec();
697-
assert_eq!(outbound_peer.process_act_two(&act_two[..], &our_node_id).unwrap()[..], hex::decode("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap()[..]);
697+
assert_eq!(outbound_peer.process_act_two(&act_two[..], &our_node_id).unwrap().0[..], hex::decode("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap()[..]);
698698

699699
match outbound_peer.noise_state {
700700
NoiseState::Finished { sk, sn, sck, rk, rn, rck } => {

src/ln/peer_handler.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
234234
if peers.peers.insert(descriptor, Peer {
235235
channel_encryptor: peer_encryptor,
236236
outbound: true,
237-
their_node_id: Some(their_node_id),
237+
their_node_id: None,
238238
their_global_features: None,
239239
their_local_features: None,
240240

@@ -438,9 +438,6 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
438438

439439
macro_rules! try_potential_handleerror {
440440
($thing: expr) => {
441-
try_potential_handleerror!($thing, false);
442-
};
443-
($thing: expr, $pre_noise: expr) => {
444441
match $thing {
445442
Ok(x) => x,
446443
Err(e) => {
@@ -449,9 +446,6 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
449446
msgs::ErrorAction::DisconnectPeer { msg: _ } => {
450447
//TODO: Try to push msg
451448
log_trace!(self, "Got Err handling message, disconnecting peer because {}", e.err);
452-
if $pre_noise {
453-
peer.their_node_id = None; // Unset so that we don't generate a peer_disconnected event
454-
}
455449
return Err(PeerHandleError{ no_connection_possible: false });
456450
},
457451
msgs::ErrorAction::IgnoreError => {
@@ -517,16 +511,17 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
517511
let next_step = peer.channel_encryptor.get_noise_step();
518512
match next_step {
519513
NextNoiseStep::ActOne => {
520-
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();
514+
let act_two = try_potential_handleerror!(peer.channel_encryptor.process_act_one_with_key(&peer.pending_read_buffer[..], &self.our_node_secret)).to_vec();
521515
peer.pending_outbound_buffer.push_back(act_two);
522516
peer.pending_read_buffer = [0; 66].to_vec(); // act three is 66 bytes long
523517
},
524518
NextNoiseStep::ActTwo => {
525-
let act_three = try_potential_handleerror!(peer.channel_encryptor.process_act_two(&peer.pending_read_buffer[..], &self.our_node_secret), true).to_vec();
526-
peer.pending_outbound_buffer.push_back(act_three);
519+
let (act_three, their_node_id) = try_potential_handleerror!(peer.channel_encryptor.process_act_two(&peer.pending_read_buffer[..], &self.our_node_secret));
520+
peer.pending_outbound_buffer.push_back(act_three.to_vec());
527521
peer.pending_read_buffer = [0; 18].to_vec(); // Message length header is 18 bytes
528522
peer.pending_read_is_header = true;
529523

524+
peer.their_node_id = Some(their_node_id);
530525
insert_node_id!();
531526
let mut local_features = msgs::LocalFeatures::new();
532527
if self.initial_syncs_sent.load(Ordering::Acquire) < INITIAL_SYNCS_TO_SEND {
@@ -539,7 +534,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
539534
}, 16);
540535
},
541536
NextNoiseStep::ActThree => {
542-
let their_node_id = try_potential_handleerror!(peer.channel_encryptor.process_act_three(&peer.pending_read_buffer[..]), true);
537+
let their_node_id = try_potential_handleerror!(peer.channel_encryptor.process_act_three(&peer.pending_read_buffer[..]));
543538
peer.pending_read_buffer = [0; 18].to_vec(); // Message length header is 18 bytes
544539
peer.pending_read_is_header = true;
545540
peer.their_node_id = Some(their_node_id);

0 commit comments

Comments
 (0)