Protect against flood of addresses (#1718)

This commit is contained in:
Pierre Krieger
2019-02-07 14:54:59 +01:00
committed by Arkadiy Paronyan
parent 593c292f14
commit 0da92bf114
2 changed files with 12 additions and 4 deletions
@@ -233,7 +233,7 @@ impl<TSubstream> NetworkBehaviourEventProcess<CustomProtosOut> for Behaviour<TSu
impl<TSubstream> NetworkBehaviourEventProcess<IdentifyEvent> for Behaviour<TSubstream> { impl<TSubstream> NetworkBehaviourEventProcess<IdentifyEvent> for Behaviour<TSubstream> {
fn inject_event(&mut self, event: IdentifyEvent) { fn inject_event(&mut self, event: IdentifyEvent) {
match event { match event {
IdentifyEvent::Identified { peer_id, info, .. } => { IdentifyEvent::Identified { peer_id, mut info, .. } => {
trace!(target: "sub-libp2p", "Identified {:?} => {:?}", peer_id, info); trace!(target: "sub-libp2p", "Identified {:?} => {:?}", peer_id, info);
// TODO: ideally we would delay the first identification to when we open the custom // TODO: ideally we would delay the first identification to when we open the custom
// protocol, so that we only report id info to the service about the nodes we // protocol, so that we only report id info to the service about the nodes we
@@ -245,6 +245,11 @@ impl<TSubstream> NetworkBehaviourEventProcess<IdentifyEvent> for Behaviour<TSubs
warn!(target: "sub-libp2p", "Received identify response with empty list of \ warn!(target: "sub-libp2p", "Received identify response with empty list of \
addresses"); addresses");
} }
if info.listen_addrs.len() > 30 {
warn!(target: "sub-libp2p", "Node {:?} id reported more than 30 addresses",
peer_id);
info.listen_addrs.truncate(30);
}
for addr in &info.listen_addrs { for addr in &info.listen_addrs {
self.discovery.kademlia.add_address(&peer_id, addr.clone()); self.discovery.kademlia.add_address(&peer_id, addr.clone());
} }
@@ -235,6 +235,11 @@ impl NetTopology {
let mut addrs: Vec<_> = addrs.collect(); let mut addrs: Vec<_> = addrs.collect();
if addrs.len() > 40 {
warn!(target: "sub-libp2p", "Attempt to add more than 40 addresses for {:?}", peer_id);
addrs.truncate(40);
}
let now_systime = SystemTime::now(); let now_systime = SystemTime::now();
let now = Instant::now(); let now = Instant::now();
@@ -246,9 +251,7 @@ impl NetTopology {
if a.expires < now_systime && !a.is_connected() { if a.expires < now_systime && !a.is_connected() {
return false return false
} }
while let Some(pos) = addrs.iter().position(|&(ref addr, _)| addr == &a.addr) { addrs.retain(|(addr, _)| *addr != a.addr);
addrs.remove(pos);
}
true true
}) })
.collect(); .collect();