From 2a8294ff2409e3f0d5e4d7e39547a9b17942e0b3 Mon Sep 17 00:00:00 2001
From: Ignacio Etcheverry <ignalfonsore@gmail.com>
Date: Wed, 10 Jul 2019 21:51:43 +0200
Subject: [PATCH] Mono: Fix null dereference in EditorExportPlatformAndroid

We need to dispose the GodotSharpExport export plugin before the editor destroys EditorSettings. Otherwise, if the GC disposes it at a later time, EditorExportPlatformAndroid will be freed after EditorSettings already was, and its device polling thread will try to access the EditorSettings singleton, resulting in null dereferencing.
---
 .../GodotTools/GodotTools/GodotSharpEditor.cs | 20 ++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
index 955574d5fe5..a8a507e8557 100644
--- a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
+++ b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs
@@ -26,6 +26,8 @@ namespace GodotTools
         private MonoDevelopInstance monoDevelopInstance;
         private MonoDevelopInstance visualStudioForMacInstance;
 
+        private WeakReference<GodotSharpExport> exportPluginWeak;
+
         public MonoBottomPanel MonoBottomPanel { get; private set; }
 
         private bool CreateProjectSolution()
@@ -513,11 +515,27 @@ namespace GodotTools
             });
 
             // Export plugin
-            AddExportPlugin(new GodotSharpExport());
+            var exportPlugin = new GodotSharpExport();
+            AddExportPlugin(exportPlugin);
+            exportPluginWeak = new WeakReference<GodotSharpExport>(exportPlugin);
 
             GodotSharpBuilds.Initialize();
         }
 
+        protected override void Dispose(bool disposing)
+        {
+            base.Dispose(disposing);
+
+            if (exportPluginWeak.TryGetTarget(out var exportPlugin))
+            {
+                // We need to dispose our export plugin before the editor destroys EditorSettings.
+                // Otherwise, if the GC disposes it at a later time, EditorExportPlatformAndroid
+                // will be freed after EditorSettings already was, and its device polling thread
+                // will try to access the EditorSettings singleton, resulting in null dereferencing.
+                exportPlugin.Dispose();
+            }
+        }
+
         public void OnBeforeSerialize()
         {
         }