From 8085d1fa2c677faaef1b466ea52055c88826a2b9 Mon Sep 17 00:00:00 2001
From: James Turner <james@flightgear.org>
Date: Mon, 26 Apr 2021 11:14:06 +0100
Subject: [PATCH] Clear ATC on the user aircraft as well

Avoids an assert/crash on exit, in some ATC configurations.
---
 src/AIModel/AIAircraft.cxx | 2 +-
 src/AIModel/AIManager.cxx  | 9 ++++++++-
 src/ATC/trafficcontrol.cxx | 9 ++++++---
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/src/AIModel/AIAircraft.cxx b/src/AIModel/AIAircraft.cxx
index c824e73a5..d29904b5a 100644
--- a/src/AIModel/AIAircraft.cxx
+++ b/src/AIModel/AIAircraft.cxx
@@ -120,7 +120,7 @@ FGAIAircraft::~FGAIAircraft()
     assert(!controller);
     if (controller) {
         // we no longer signOff from controller here, controller should
-        // have been cleared using clearATCCOntrollers
+        // have been cleared using clearATCControllers
         // see FLIGHTGEAR-15 on Sentry
         SG_LOG(SG_AI, SG_ALERT, "Destruction of AIAircraft which was not unbound");
     }
diff --git a/src/AIModel/AIManager.cxx b/src/AIModel/AIManager.cxx
index 859aa411a..4aea54672 100644
--- a/src/AIModel/AIManager.cxx
+++ b/src/AIModel/AIManager.cxx
@@ -319,7 +319,14 @@ FGAIManager::shutdown()
 
     ai_list.clear();
     _environmentVisiblity.clear();
-    _userAircraft.clear();
+
+    if (_userAircraft) {
+        _userAircraft->setDie(true);
+        // we can't unbind() but we do need to clear these
+        _userAircraft->clearATCController();
+        _userAircraft.clear();
+    }
+
     static_haveRegisteredScenarios = false;
     
     globals->get_commands()->removeCommand("load-scenario");
diff --git a/src/ATC/trafficcontrol.cxx b/src/ATC/trafficcontrol.cxx
index 739540e38..fb67404e0 100644
--- a/src/ATC/trafficcontrol.cxx
+++ b/src/ATC/trafficcontrol.cxx
@@ -59,9 +59,12 @@ namespace {
 
 void clearTrafficControllers(TrafficVector& vec)
 {
-    TrafficVectorIterator it = vec.begin();
-    for (; it != vec.end(); ++it) {
-        it->getAircraft()->clearATCController();
+    for (const auto& traffic : vec) {
+        if (!traffic.getAircraft()) {
+            continue;
+        }
+
+        traffic.getAircraft()->clearATCController();
     }
 }