From 6a7de07fda89a6ada40e62aefbf791386c66e33c Mon Sep 17 00:00:00 2001
From: James Turner <james@flightgear.org>
Date: Tue, 8 Jun 2021 17:46:05 +0100
Subject: [PATCH] ErrorReporter: fix a crash on exit found by ASan

If we exit without shutdown()-ing the error report, ensure the
error logging callback is cleaned up.
---
 src/Main/ErrorReporter.cxx | 13 +++++++++++++
 src/Main/ErrorReporter.hxx |  1 +
 2 files changed, 14 insertions(+)

diff --git a/src/Main/ErrorReporter.cxx b/src/Main/ErrorReporter.cxx
index 7afddd4f4..92fded6c0 100644
--- a/src/Main/ErrorReporter.cxx
+++ b/src/Main/ErrorReporter.cxx
@@ -213,6 +213,7 @@ public:
     using OccurrenceVec = std::vector<ErrorOcurrence>;
 
     std::unique_ptr<RecentLogCallback> _logCallback;
+    bool _logCallbackRegistered = false;
 
     string _terrasyncPathPrefix;
     string _fgdataPathPrefix;
@@ -709,6 +710,15 @@ ErrorReporter::ErrorReporter() : d(new ErrorReporterPrivate)
         "/scenery/use-vpb"};
 }
 
+ErrorReporter::~ErrorReporter()
+{
+    // if we are deleted withut being shutdown(), ensure we clean
+    // up our logging callback
+    if (d->_logCallbackRegistered) {
+        sglog().removeCallback(d->_logCallback.get());
+    }
+}
+
 void ErrorReporter::bind()
 {
     SGPropertyNode_ptr n = fgGetNode("/sim/error-report", true);
@@ -742,6 +752,7 @@ void ErrorReporter::preinit()
     });
 
     sglog().addCallback(d->_logCallback.get());
+    d->_logCallbackRegistered = true;
 }
 
 void ErrorReporter::init()
@@ -758,6 +769,7 @@ void ErrorReporter::init()
         simgear::setFailureCallback(simgear::FailureCallback());
         simgear::setErrorContextCallback(simgear::ContextCallback());
         sglog().removeCallback(d->_logCallback.get());
+        d->_logCallbackRegistered = false;
         return;
     }
 
@@ -874,6 +886,7 @@ void ErrorReporter::shutdown()
         globals->get_commands()->removeCommand("save-error-report-data");
         globals->get_commands()->removeCommand("show-error-report");
         sglog().removeCallback(d->_logCallback.get());
+        d->_logCallbackRegistered = false;
     }
 }
 
diff --git a/src/Main/ErrorReporter.hxx b/src/Main/ErrorReporter.hxx
index af6744bd5..eda196321 100644
--- a/src/Main/ErrorReporter.hxx
+++ b/src/Main/ErrorReporter.hxx
@@ -30,6 +30,7 @@ class ErrorReporter : public SGSubsystem
 {
 public:
     ErrorReporter();
+    ~ErrorReporter();
 
     void preinit();