Fix bad state transition with DisabledPendingEnable+OpenDesiredByRemote (#7638)

This commit is contained in:
Pierre Krieger
2020-11-30 18:43:47 +01:00
committed by GitHub
parent 4ccf6672b1
commit 35efc8e4b0
@@ -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