Skip to content

Commit 3dee0cf

Browse files
committed
Fix panic when peer is mid-handshake
Peer::their_node_id is set to Some during the handshake process. However, df3ab2e accesses the field unconditionally, causing a panic. This may be triggered if a gossip message is received mid-handshake from another peer or if the user calls broadcast_node_announcement during this time. The latter tends to be executed on a timer. Ensure that Peer::their_node_id is only accessed once the handshake is complete.
1 parent 5c83348 commit 3dee0cf

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1835,13 +1835,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
18351835

18361836
for (_, peer_mutex) in peers.iter() {
18371837
let mut peer = peer_mutex.lock().unwrap();
1838-
let logger = WithContext::from(&self.logger, Some(peer.their_node_id.unwrap().0), None);
18391838
if !peer.handshake_complete() ||
18401839
!peer.should_forward_channel_announcement(msg.contents.short_channel_id) {
18411840
continue
18421841
}
18431842
debug_assert!(peer.their_node_id.is_some());
18441843
debug_assert!(peer.channel_encryptor.is_ready_for_encryption());
1844+
let logger = WithContext::from(&self.logger, Some(peer.their_node_id.unwrap().0), None);
18451845
if peer.buffer_full_drop_gossip_broadcast() {
18461846
log_gossip!(logger, "Skipping broadcast message to {:?} as its outbound buffer is full", peer.their_node_id);
18471847
continue;
@@ -1863,13 +1863,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
18631863

18641864
for (_, peer_mutex) in peers.iter() {
18651865
let mut peer = peer_mutex.lock().unwrap();
1866-
let logger = WithContext::from(&self.logger, Some(peer.their_node_id.unwrap().0), None);
18671866
if !peer.handshake_complete() ||
18681867
!peer.should_forward_node_announcement(msg.contents.node_id) {
18691868
continue
18701869
}
18711870
debug_assert!(peer.their_node_id.is_some());
18721871
debug_assert!(peer.channel_encryptor.is_ready_for_encryption());
1872+
let logger = WithContext::from(&self.logger, Some(peer.their_node_id.unwrap().0), None);
18731873
if peer.buffer_full_drop_gossip_broadcast() {
18741874
log_gossip!(logger, "Skipping broadcast message to {:?} as its outbound buffer is full", peer.their_node_id);
18751875
continue;
@@ -1891,13 +1891,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
18911891

18921892
for (_, peer_mutex) in peers.iter() {
18931893
let mut peer = peer_mutex.lock().unwrap();
1894-
let logger = WithContext::from(&self.logger, Some(peer.their_node_id.unwrap().0), None);
18951894
if !peer.handshake_complete() ||
18961895
!peer.should_forward_channel_announcement(msg.contents.short_channel_id) {
18971896
continue
18981897
}
18991898
debug_assert!(peer.their_node_id.is_some());
19001899
debug_assert!(peer.channel_encryptor.is_ready_for_encryption());
1900+
let logger = WithContext::from(&self.logger, Some(peer.their_node_id.unwrap().0), None);
19011901
if peer.buffer_full_drop_gossip_broadcast() {
19021902
log_gossip!(logger, "Skipping broadcast message to {:?} as its outbound buffer is full", peer.their_node_id);
19031903
continue;

0 commit comments

Comments
 (0)