From 35efc8e4b04cba1b6310ce908520ed5a969f7baa Mon Sep 17 00:00:00 2001
From: Pierre Krieger <pierre.krieger1708@gmail.com>
Date: Mon, 30 Nov 2020 18:43:47 +0100
Subject: [PATCH] Fix bad state transition with
 DisabledPendingEnable+OpenDesiredByRemote (#7638)

---
 .../src/protocol/generic_proto/behaviour.rs   | 30 +++++--------------
 1 file changed, 8 insertions(+), 22 deletions(-)

diff --git a/substrate/client/network/src/protocol/generic_proto/behaviour.rs b/substrate/client/network/src/protocol/generic_proto/behaviour.rs
index f76b3cc7160..51d7252d5f9 100644
--- a/substrate/client/network/src/protocol/generic_proto/behaviour.rs
+++ b/substrate/client/network/src/protocol/generic_proto/behaviour.rs
@@ -1575,34 +1575,20 @@ impl NetworkBehaviour for GenericProto {
 						}
 					}
 
-					// DisabledPendingEnable => DisabledPendingEnable | Incoming
+					// DisabledPendingEnable => Enabled | DisabledPendingEnable
 					PeerState::DisabledPendingEnable { mut connections, timer, timer_deadline } => {
 						if let Some((_, connec_state)) = connections.iter_mut().find(|(c, _)| *c == connection) {
 							if let ConnectionState::Closed = *connec_state {
-								*connec_state = ConnectionState::OpenDesiredByRemote;
-
-								let incoming_id = self.next_incoming_index;
-								self.next_incoming_index.0 = match self.next_incoming_index.0.checked_add(1) {
-									Some(v) => v,
-									None => {
-										error!(target: "sub-libp2p", "Overflow in next_incoming_index");
-										return
-									}
-								};
-
-								debug!(target: "sub-libp2p", "PSM <= Incoming({}, {:?}).",
-									source, incoming_id);
-								self.peerset.incoming(source.clone(), incoming_id);
-								self.incoming.push(IncomingPeer {
+								debug!(target: "sub-libp2p", "Handler({:?}, {:?}) <= Open",
+									source, connection);
+								self.events.push_back(NetworkBehaviourAction::NotifyHandler {
 									peer_id: source.clone(),
-									alive: true,
-									incoming_id,
+									handler: NotifyHandler::One(connection),
+									event: NotifsHandlerIn::Open,
 								});
+								*connec_state = ConnectionState::Opening;
 
-								*entry.into_mut() = PeerState::Incoming {
-									connections,
-									backoff_until: Some(timer_deadline),
-								};
+								*entry.into_mut() = PeerState::Enabled { connections };
 
 							} else {
 								// Connections in `OpeningThenClosing` are in a Closed phase, and
-- 
GitLab