Skip to content

Commit 2c33d6d

Browse files
committed
Fix race between outbound messages and peer disconnection
Previously, outbound messages held in `process_events` could race with peer disconnection, allowing a message intended for a peer before disconnection to be sent to the same peer after disconnection. The fix is simple - hold the peers read lock while we fetch pending messages from peers (as we disconnect with the write lock).
1 parent 1667ef5 commit 2c33d6d

File tree

1 file changed

+4
-6
lines changed

1 file changed

+4
-6
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1891,15 +1891,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
18911891
let flush_read_disabled = self.gossip_processing_backlog_lifted.swap(false, Ordering::Relaxed);
18921892

18931893
let mut peers_to_disconnect = HashMap::new();
1894-
let mut events_generated = self.message_handler.chan_handler.get_and_clear_pending_msg_events();
1895-
events_generated.append(&mut self.message_handler.route_handler.get_and_clear_pending_msg_events());
18961894

18971895
{
1898-
// TODO: There are some DoS attacks here where you can flood someone's outbound send
1899-
// buffer by doing things like announcing channels on another node. We should be willing to
1900-
// drop optional-ish messages when send buffers get full!
1901-
19021896
let peers_lock = self.peers.read().unwrap();
1897+
1898+
let mut events_generated = self.message_handler.chan_handler.get_and_clear_pending_msg_events();
1899+
events_generated.append(&mut self.message_handler.route_handler.get_and_clear_pending_msg_events());
1900+
19031901
let peers = &*peers_lock;
19041902
macro_rules! get_peer_for_forwarding {
19051903
($node_id: expr) => {

0 commit comments

Comments
 (0)