Skip to content

Commit 6dab6b1

Browse files
committed
Disconnect duplicate node_id connections after Noise handshake
1 parent c2bbeb5 commit 6dab6b1

File tree

1 file changed

+31
-13
lines changed

1 file changed

+31
-13
lines changed

src/ln/peer_handler.rs

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use util::byte_utils;
77
use util::events::{EventsProvider,Event};
88
use util::logger::Logger;
99

10-
use std::collections::{HashMap,LinkedList};
10+
use std::collections::{HashMap,hash_map,LinkedList};
1111
use std::sync::{Arc, Mutex};
1212
use std::sync::atomic::{AtomicUsize, Ordering};
1313
use std::{cmp,error,mem,hash,fmt};
@@ -90,6 +90,18 @@ struct PeerHolder<Descriptor: SocketDescriptor> {
9090
/// Only add to this set when noise completes:
9191
node_id_to_descriptor: HashMap<PublicKey, Descriptor>,
9292
}
93+
struct MutPeerHolder<'a, Descriptor: SocketDescriptor + 'a> {
94+
peers: &'a mut HashMap<Descriptor, Peer>,
95+
node_id_to_descriptor: &'a mut HashMap<PublicKey, Descriptor>,
96+
}
97+
impl<Descriptor: SocketDescriptor> PeerHolder<Descriptor> {
98+
fn borrow_parts(&mut self) -> MutPeerHolder<Descriptor> {
99+
MutPeerHolder {
100+
peers: &mut self.peers,
101+
node_id_to_descriptor: &mut self.node_id_to_descriptor,
102+
}
103+
}
104+
}
93105

94106
pub struct PeerManager<Descriptor: SocketDescriptor> {
95107
message_handler: MessageHandler,
@@ -100,7 +112,6 @@ pub struct PeerManager<Descriptor: SocketDescriptor> {
100112
logger: Arc<Logger>,
101113
}
102114

103-
104115
macro_rules! encode_msg {
105116
($msg: expr, $msg_code: expr) => {
106117
{
@@ -267,14 +278,14 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
267278

268279
fn do_read_event(&self, peer_descriptor: &mut Descriptor, data: Vec<u8>) -> Result<bool, PeerHandleError> {
269280
let pause_read = {
270-
let mut peers = self.peers.lock().unwrap();
271-
let (should_insert_node_id, pause_read) = match peers.peers.get_mut(peer_descriptor) {
281+
let mut peers_lock = self.peers.lock().unwrap();
282+
let peers = peers_lock.borrow_parts();
283+
let pause_read = match peers.peers.get_mut(peer_descriptor) {
272284
None => panic!("Descriptor for read_event is not already known to PeerManager"),
273285
Some(peer) => {
274286
assert!(peer.pending_read_buffer.len() > 0);
275287
assert!(peer.pending_read_buffer.len() > peer.pending_read_buffer_pos);
276288

277-
let mut insert_node_id = None;
278289
let mut read_pos = 0;
279290
while read_pos < data.len() {
280291
{
@@ -353,6 +364,18 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
353364
}
354365
}
355366

367+
macro_rules! insert_node_id {
368+
() => {
369+
match peers.node_id_to_descriptor.entry(peer.their_node_id.unwrap()) {
370+
hash_map::Entry::Occupied(_) => {
371+
peer.their_node_id = None; // Unset so that we don't generate a peer_disconnected event
372+
return Err(PeerHandleError{ no_connection_possible: false })
373+
},
374+
hash_map::Entry::Vacant(entry) => entry.insert(peer_descriptor.clone()),
375+
};
376+
}
377+
}
378+
356379
let next_step = peer.channel_encryptor.get_noise_step();
357380
match next_step {
358381
NextNoiseStep::ActOne => {
@@ -366,7 +389,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
366389
peer.pending_read_buffer = [0; 18].to_vec(); // Message length header is 18 bytes
367390
peer.pending_read_is_header = true;
368391

369-
insert_node_id = Some(peer.their_node_id.unwrap());
392+
insert_node_id!();
370393
let mut local_features = msgs::LocalFeatures::new();
371394
if self.initial_syncs_sent.load(Ordering::Acquire) < INITIAL_SYNCS_TO_SEND {
372395
self.initial_syncs_sent.fetch_add(1, Ordering::AcqRel);
@@ -382,7 +405,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
382405
peer.pending_read_buffer = [0; 18].to_vec(); // Message length header is 18 bytes
383406
peer.pending_read_is_header = true;
384407
peer.their_node_id = Some(their_node_id);
385-
insert_node_id = Some(peer.their_node_id.unwrap());
408+
insert_node_id!();
386409
},
387410
NextNoiseStep::NoiseComplete => {
388411
if peer.pending_read_is_header {
@@ -607,15 +630,10 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
607630

608631
Self::do_attempt_write_data(peer_descriptor, peer);
609632

610-
(insert_node_id /* should_insert_node_id */, peer.pending_outbound_buffer.len() > 10) // pause_read
633+
peer.pending_outbound_buffer.len() > 10 // pause_read
611634
}
612635
};
613636

614-
match should_insert_node_id {
615-
Some(node_id) => { peers.node_id_to_descriptor.insert(node_id, peer_descriptor.clone()); },
616-
None => {}
617-
};
618-
619637
pause_read
620638
};
621639

0 commit comments

Comments
 (0)