From d143e146945e42f4b6ce502615e971f6a4bc18ea Mon Sep 17 00:00:00 2001
From: Jon Evans <jon@craftyjon.com>
Date: Fri, 3 Jul 2020 22:34:16 -0400
Subject: [PATCH] Fix memory leaks in color theme editor

Fixes https://gitlab.com/kicad/code/kicad/-/issues/4794
---
 common/settings/color_settings.cpp            | 22 +++++++++++++++++++
 .../dialogs/panel_eeschema_color_settings.cpp |  2 ++
 include/settings/color_settings.h             |  8 +++++++
 3 files changed, 32 insertions(+)

diff --git a/common/settings/color_settings.cpp b/common/settings/color_settings.cpp
index c2eddaa27a..40c43a6362 100644
--- a/common/settings/color_settings.cpp
+++ b/common/settings/color_settings.cpp
@@ -211,6 +211,28 @@ COLOR_SETTINGS::COLOR_SETTINGS( std::string aFilename ) :
 }
 
 
+COLOR_SETTINGS::COLOR_SETTINGS( const COLOR_SETTINGS& aOther ) :
+        JSON_SETTINGS( aOther.m_filename, SETTINGS_LOC::COLORS, colorsSchemaVersion )
+{
+    m_displayName           = aOther.m_displayName;
+    m_overrideSchItemColors = aOther.m_overrideSchItemColors;
+    m_colors                = aOther.m_colors;
+    m_defaultColors         = aOther.m_defaultColors;
+}
+
+
+COLOR_SETTINGS& COLOR_SETTINGS::operator=( const COLOR_SETTINGS &aOther )
+{
+    m_filename              = aOther.m_filename;
+    m_displayName           = aOther.m_displayName;
+    m_overrideSchItemColors = aOther.m_overrideSchItemColors;
+    m_colors                = aOther.m_colors;
+    m_defaultColors         = aOther.m_defaultColors;
+
+    return *this;
+}
+
+
 bool COLOR_SETTINGS::MigrateFromLegacy( wxConfigBase* aCfg )
 {
     return false;
diff --git a/eeschema/dialogs/panel_eeschema_color_settings.cpp b/eeschema/dialogs/panel_eeschema_color_settings.cpp
index 7e8e86812b..8c6cbd580f 100644
--- a/eeschema/dialogs/panel_eeschema_color_settings.cpp
+++ b/eeschema/dialogs/panel_eeschema_color_settings.cpp
@@ -105,6 +105,8 @@ PANEL_EESCHEMA_COLOR_SETTINGS::~PANEL_EESCHEMA_COLOR_SETTINGS()
 {
     delete m_page;
     delete m_titleBlock;
+    delete m_ws;
+    delete m_currentSettings;
 
     for( EDA_ITEM* item : m_previewItems )
         delete item;
diff --git a/include/settings/color_settings.h b/include/settings/color_settings.h
index 8f1fbac266..987e236a84 100644
--- a/include/settings/color_settings.h
+++ b/include/settings/color_settings.h
@@ -64,6 +64,14 @@ public:
 
     virtual ~COLOR_SETTINGS() {}
 
+    /**
+     * Copy ctor provided for temporary manipulation of themes in the theme editor.
+     * This will not copy the JSON_SETTINGS underlying data.
+     */
+    COLOR_SETTINGS( const COLOR_SETTINGS& aOther );
+
+    COLOR_SETTINGS& operator=( const COLOR_SETTINGS &aOther );
+
     bool MigrateFromLegacy( wxConfigBase* aCfg ) override;
 
     bool Migrate() override;