From a9e97848dd97eb49a52dad6a4b23e6c09adf5414 Mon Sep 17 00:00:00 2001 From: Jon Evans Date: Fri, 3 Jul 2020 19:13:06 -0400 Subject: [PATCH] Fix use after free on BOARD_DESIGN_SETTINGS Fixes https://gitlab.com/kicad/code/kicad/-/issues/4792 --- include/board_design_settings.h | 2 ++ pcbnew/board_design_settings.cpp | 53 ++++++++++++++++++++++++++++++++ pcbnew/footprint_edit_frame.cpp | 2 ++ 3 files changed, 57 insertions(+) diff --git a/include/board_design_settings.h b/include/board_design_settings.h index 16edf9021e..a70304d693 100644 --- a/include/board_design_settings.h +++ b/include/board_design_settings.h @@ -347,6 +347,8 @@ public: virtual ~BOARD_DESIGN_SETTINGS(); + BOARD_DESIGN_SETTINGS& operator=( const BOARD_DESIGN_SETTINGS& aOther ); + bool LoadFromFile( const std::string& aDirectory = "" ) override; BOARD_STACKUP& GetStackupDescriptor() { return m_stackup; } diff --git a/pcbnew/board_design_settings.cpp b/pcbnew/board_design_settings.cpp index 1dc51fca9c..3a5963e05f 100644 --- a/pcbnew/board_design_settings.cpp +++ b/pcbnew/board_design_settings.cpp @@ -569,6 +569,59 @@ BOARD_DESIGN_SETTINGS::~BOARD_DESIGN_SETTINGS() } +BOARD_DESIGN_SETTINGS& BOARD_DESIGN_SETTINGS::operator=( const BOARD_DESIGN_SETTINGS& aOther ) +{ + // Copy of NESTED_SETTINGS around is not allowed, so let's just update the params. + m_TrackWidthList = aOther.m_TrackWidthList; + m_ViasDimensionsList = aOther.m_ViasDimensionsList; + m_DiffPairDimensionsList = aOther.m_DiffPairDimensionsList; + m_DRCRuleSelectors = aOther.m_DRCRuleSelectors; + m_DRCRules = aOther.m_DRCRules; + m_MicroViasAllowed = aOther.m_MicroViasAllowed; + m_BlindBuriedViaAllowed = aOther.m_BlindBuriedViaAllowed; + m_CurrentViaType = aOther.m_CurrentViaType; + m_UseConnectedTrackWidth = aOther.m_UseConnectedTrackWidth; + m_MinClearance = aOther.m_MinClearance; + m_TrackMinWidth = aOther.m_TrackMinWidth; + m_ViasMinAnnulus = aOther.m_ViasMinAnnulus; + m_ViasMinSize = aOther.m_ViasMinSize; + m_MinThroughDrill = aOther.m_MinThroughDrill; + m_MicroViasMinSize = aOther.m_MicroViasMinSize; + m_MicroViasMinDrill = aOther.m_MicroViasMinDrill; + m_CopperEdgeClearance = aOther.m_CopperEdgeClearance; + m_HoleToHoleMin = aOther.m_HoleToHoleMin; + m_DRCSeverities = aOther.m_DRCSeverities; + m_DrcExclusions = aOther.m_DrcExclusions; + m_ZoneUseNoOutlineInFill = aOther.m_ZoneUseNoOutlineInFill; + m_MaxError = aOther.m_MaxError; + m_SolderMaskMargin = aOther.m_SolderMaskMargin; + m_SolderMaskMinWidth = aOther.m_SolderMaskMinWidth; + m_SolderPasteMarginRatio = aOther.m_SolderPasteMarginRatio; + m_DefaultFPTextItems = aOther.m_DefaultFPTextItems; + m_DimensionUnits = aOther.m_DimensionUnits; + m_DimensionPrecision = aOther.m_DimensionPrecision; + m_AuxOrigin = aOther.m_AuxOrigin; + m_GridOrigin = aOther.m_GridOrigin; + + std::copy( std::begin( aOther.m_LineThickness ), std::end( aOther.m_LineThickness ), + std::begin( m_LineThickness ) ); + + std::copy( std::begin( aOther.m_TextSize ), std::end( aOther.m_TextSize ), + std::begin( m_TextSize ) ); + + std::copy( std::begin( aOther.m_TextThickness ), std::end( aOther.m_TextThickness ), + std::begin( m_TextThickness ) ); + + std::copy( std::begin( aOther.m_TextItalic ), std::end( aOther.m_TextItalic ), + std::begin( m_TextItalic ) ); + + std::copy( std::begin( aOther.m_TextUpright ), std::end( aOther.m_TextUpright ), + std::begin( m_TextUpright ) ); + + return *this; +} + + bool BOARD_DESIGN_SETTINGS::LoadFromFile( const std::string& aDirectory ) { bool ret = NESTED_SETTINGS::LoadFromFile( aDirectory ); diff --git a/pcbnew/footprint_edit_frame.cpp b/pcbnew/footprint_edit_frame.cpp index b5fabf3f1b..81c301574c 100644 --- a/pcbnew/footprint_edit_frame.cpp +++ b/pcbnew/footprint_edit_frame.cpp @@ -533,6 +533,8 @@ void FOOTPRINT_EDIT_FRAME::OnCloseWindow( wxCloseEvent& aEvent ) // the Layer Manger m_auimgr.GetPane( "LayersManager" ).Show( false ); + Pgm().GetSettingsManager().FlushAndRelease( GetSettings() ); + Clear_Pcb( false ); // Close the editor