From 2a8294ff2409e3f0d5e4d7e39547a9b17942e0b3 Mon Sep 17 00:00:00 2001 From: Ignacio Etcheverry Date: Wed, 10 Jul 2019 21:51:43 +0200 Subject: 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. --- .../editor/GodotTools/GodotTools/GodotSharpEditor.cs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'modules/mono/editor') diff --git a/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs b/modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs index 955574d5fe..a8a507e855 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 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(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() { } -- cgit v1.2.3