From 33e8a15d3667908c86a1b31db2c1bafc74c58984 Mon Sep 17 00:00:00 2001 From: Keith Bennett <keith@airmap.com> Date: Thu, 15 Apr 2021 22:01:15 -0500 Subject: [PATCH] fix racey `if (weak_ptr.expired()) {...weak_ptr.lock()...}` --- src/Vehicle/InitialConnectStateMachine.cc | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/src/Vehicle/InitialConnectStateMachine.cc b/src/Vehicle/InitialConnectStateMachine.cc index 61fbb90..17d34df 100644 --- a/src/Vehicle/InitialConnectStateMachine.cc +++ b/src/Vehicle/InitialConnectStateMachine.cc @@ -95,10 +95,9 @@ void InitialConnectStateMachine::_stateRequestCapabilities(StateMachine* stateMa { InitialConnectStateMachine* connectMachine = static_cast<InitialConnectStateMachine*>(stateMachine); Vehicle* vehicle = connectMachine->_vehicle; - WeakLinkInterfacePtr weakLink = vehicle->vehicleLinkManager()->primaryLink(); + SharedLinkInterfacePtr sharedLink = vehicle->vehicleLinkManager()->primaryLink().lock(); - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - if (weakLink.expired()) { + if (!sharedLink) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestCapabilities Skipping capability request due to no primary link"; connectMachine->advance(); } else { @@ -206,14 +205,12 @@ void InitialConnectStateMachine::_stateRequestProtocolVersion(StateMachine* stat { InitialConnectStateMachine* connectMachine = static_cast<InitialConnectStateMachine*>(stateMachine); Vehicle* vehicle = connectMachine->_vehicle; - WeakLinkInterfacePtr weakLink = vehicle->vehicleLinkManager()->primaryLink(); + SharedLinkInterfacePtr sharedLink = vehicle->vehicleLinkManager()->primaryLink().lock(); - if (weakLink.expired()) { + if (!sharedLink) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestProtocolVersion Skipping protocol version request due to no primary link"; connectMachine->advance(); } else { - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - if (sharedLink->linkConfiguration()->isHighLatency() || sharedLink->isPX4Flow() || sharedLink->isLogReplay()) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestProtocolVersion Skipping protocol version request due to link type"; connectMachine->advance(); @@ -316,17 +313,15 @@ void InitialConnectStateMachine::_stateRequestMission(StateMachine* stateMachine { InitialConnectStateMachine* connectMachine = static_cast<InitialConnectStateMachine*>(stateMachine); Vehicle* vehicle = connectMachine->_vehicle; - WeakLinkInterfacePtr weakLink = vehicle->vehicleLinkManager()->primaryLink(); + SharedLinkInterfacePtr sharedLink = vehicle->vehicleLinkManager()->primaryLink().lock(); disconnect(vehicle->_parameterManager, &ParameterManager::loadProgressChanged, connectMachine, &InitialConnectStateMachine::gotProgressUpdate); - if (weakLink.expired()) { + if (!sharedLink) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestMission: Skipping first mission load request due to no primary link"; connectMachine->advance(); } else { - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - if (sharedLink->linkConfiguration()->isHighLatency() || sharedLink->isPX4Flow() || sharedLink->isLogReplay()) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestMission: Skipping first mission load request due to link type"; vehicle->_firstMissionLoadComplete(); @@ -341,14 +336,12 @@ void InitialConnectStateMachine::_stateRequestGeoFence(StateMachine* stateMachin { InitialConnectStateMachine* connectMachine = static_cast<InitialConnectStateMachine*>(stateMachine); Vehicle* vehicle = connectMachine->_vehicle; - WeakLinkInterfacePtr weakLink = vehicle->vehicleLinkManager()->primaryLink(); + SharedLinkInterfacePtr sharedLink = vehicle->vehicleLinkManager()->primaryLink().lock(); - if (weakLink.expired()) { + if (!sharedLink) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestGeoFence: Skipping first geofence load request due to no primary link"; connectMachine->advance(); } else { - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - if (sharedLink->linkConfiguration()->isHighLatency() || sharedLink->isPX4Flow() || sharedLink->isLogReplay()) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestGeoFence: Skipping first geofence load request due to link type"; vehicle->_firstGeoFenceLoadComplete(); @@ -368,14 +361,12 @@ void InitialConnectStateMachine::_stateRequestRallyPoints(StateMachine* stateMac { InitialConnectStateMachine* connectMachine = static_cast<InitialConnectStateMachine*>(stateMachine); Vehicle* vehicle = connectMachine->_vehicle; - WeakLinkInterfacePtr weakLink = vehicle->vehicleLinkManager()->primaryLink(); + SharedLinkInterfacePtr sharedLink = vehicle->vehicleLinkManager()->primaryLink().lock(); - if (weakLink.expired()) { + if (!sharedLink) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestRallyPoints: Skipping first rally point load request due to no primary link"; connectMachine->advance(); } else { - SharedLinkInterfacePtr sharedLink = weakLink.lock(); - if (sharedLink->linkConfiguration()->isHighLatency() || sharedLink->isPX4Flow() || sharedLink->isLogReplay()) { qCDebug(InitialConnectStateMachineLog) << "_stateRequestRallyPoints: Skipping first rally point load request due to link type"; vehicle->_firstRallyPointLoadComplete();