From e296cf8cba90b29cfef5cf6e3399dc56dd3fae41 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 21 May 2019 14:56:58 +0300 Subject: [PATCH] fix panic in PSM when add_reserved_peer(same_peer) is called twice (#2640) --- substrate/core/peerset/src/peersstate.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/substrate/core/peerset/src/peersstate.rs b/substrate/core/peerset/src/peersstate.rs index c02b1daf62..a6a375b369 100644 --- a/substrate/core/peerset/src/peersstate.rs +++ b/substrate/core/peerset/src/peersstate.rs @@ -291,6 +291,10 @@ impl<'a> ConnectedPeer<'a> { /// Sets whether or not the node is reserved. pub fn set_reserved(&mut self, reserved: bool) { + if reserved == self.state.reserved { + return; + } + if reserved { self.state.reserved = true; match self.state.connection_state { @@ -595,4 +599,16 @@ mod tests { peer.set_reserved(true); peer.disconnect(); } + + #[test] + fn multiple_set_reserved_calls_doesnt_panic() { + let mut peers_state = PeersState::new(1, 1); + let id = PeerId::random(); + let mut peer = peers_state.peer(&id) + .into_unknown().unwrap().discover() + .force_outgoing(); + peer.set_reserved(true); + peer.set_reserved(true); + peer.disconnect(); + } }