diff --git a/network-libp2p/src/discovery/handler.rs b/network-libp2p/src/discovery/handler.rs index 4fb2388d84..57d96d6c18 100644 --- a/network-libp2p/src/discovery/handler.rs +++ b/network-libp2p/src/discovery/handler.rs @@ -528,6 +528,32 @@ impl ConnectionHandler for Handler { ); } + // Check and verify the peer contacts received + if peer_contacts.len() > self.config.update_limit as usize { + return Poll::Ready( + ConnectionHandlerEvent::NotifyBehaviour( + HandlerOutEvent::Error( + Error::UpdateLimitExceeded { + num_peer_contacts: peer_contacts.len(), + }, + ), + ), + ); + } + for peer_contact in &peer_contacts { + if !peer_contact.verify() { + return Poll::Ready( + ConnectionHandlerEvent::NotifyBehaviour( + HandlerOutEvent::Error( + Error::InvalidPeerContactSignature { + peer_contact: peer_contact.clone(), + }, + ), + ), + ); + } + } + let mut peer_contact_book = self.peer_contact_book.write(); // Insert the peer into the peer contact book. @@ -614,7 +640,7 @@ impl ConnectionHandler for Handler { } self.last_update_time = Some(now); - // Check if the update is not too large. + // Check if the update is not too large and if the peer contacts verify if peer_contacts.len() > self.config.update_limit as usize { return Poll::Ready( ConnectionHandlerEvent::NotifyBehaviour( @@ -626,6 +652,19 @@ impl ConnectionHandler for Handler { ), ); } + for peer_contact in &peer_contacts { + if !peer_contact.verify() { + return Poll::Ready( + ConnectionHandlerEvent::NotifyBehaviour( + HandlerOutEvent::Error( + Error::InvalidPeerContactSignature { + peer_contact: peer_contact.clone(), + }, + ), + ), + ); + } + } // Insert the new peer contacts into the peer contact book. self.peer_contact_book.write().insert_all_filtered( diff --git a/network-libp2p/tests/network.rs b/network-libp2p/tests/network.rs index 3c2faeb928..0a58ddedab 100644 --- a/network-libp2p/tests/network.rs +++ b/network-libp2p/tests/network.rs @@ -352,9 +352,9 @@ async fn create_network_with_n_peers(n_peers: usize) -> Vec { networks } -#[test(tokio::test)] +#[test(tokio::test(flavor = "multi_thread", worker_threads = 10))] async fn connections_stress_and_reconnect() { - let peers: usize = 15; + let peers: usize = 10; let networks = create_network_with_n_peers(peers).await; assert_eq!(peers, networks.len());