From b71fa91bc4aa99cd94dc5be99d3e94d9aaa16d5c Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 8 Feb 2023 01:32:19 +0300 Subject: [PATCH] Don't write outside of overrides array on pad zone_layer_connections. Use std::array to catch future errors in Debug. Fixes https://gitlab.com/kicad/code/kicad/issues/13803 --- pcbnew/pad.cpp | 3 +-- pcbnew/pad.h | 8 ++++---- pcbnew/pcb_track.cpp | 3 +-- pcbnew/pcb_track.h | 10 +++++----- pcbnew/plugins/kicad/pcb_parser.cpp | 10 +++++++--- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/pcbnew/pad.cpp b/pcbnew/pad.cpp index b34477fbc4..731781071b 100644 --- a/pcbnew/pad.cpp +++ b/pcbnew/pad.cpp @@ -105,8 +105,7 @@ PAD::PAD( FOOTPRINT* parent ) : m_removeUnconnectedLayer = false; m_keepTopBottomLayer = true; - for( size_t ii = 0; ii < arrayDim( m_zoneLayerOverrides ); ++ii ) - m_zoneLayerOverrides[ ii ] = ZLO_NONE; + m_zoneLayerOverrides.fill( ZLO_NONE ); } diff --git a/pcbnew/pad.h b/pcbnew/pad.h index e2821c0cb3..2d4c571cad 100644 --- a/pcbnew/pad.h +++ b/pcbnew/pad.h @@ -26,6 +26,7 @@ #define PAD_H #include +#include #include #include #include @@ -741,8 +742,7 @@ public: void ClearZoneLayerOverrides() { - for( size_t ii = 0; ii < arrayDim( m_zoneLayerOverrides ); ++ii ) - m_zoneLayerOverrides[ ii ] = ZLO_NONE; + m_zoneLayerOverrides.fill( ZLO_NONE ); } const ZONE_LAYER_OVERRIDE& GetZoneLayerOverride( PCB_LAYER_ID aLayer ) const @@ -874,8 +874,8 @@ private: // while 90° will produce a +. int m_thermalGap; - std::mutex m_zoneLayerOverridesMutex; - ZONE_LAYER_OVERRIDE m_zoneLayerOverrides[B_Cu + 1]; + std::mutex m_zoneLayerOverridesMutex; + std::array m_zoneLayerOverrides; }; #endif // PAD_H diff --git a/pcbnew/pcb_track.cpp b/pcbnew/pcb_track.cpp index 3ef13b431f..155cccfa5d 100644 --- a/pcbnew/pcb_track.cpp +++ b/pcbnew/pcb_track.cpp @@ -89,8 +89,7 @@ PCB_VIA::PCB_VIA( BOARD_ITEM* aParent ) : m_removeUnconnectedLayer = false; m_keepStartEndLayer = true; - for( size_t ii = 0; ii < arrayDim( m_zoneLayerOverrides ); ++ii ) - m_zoneLayerOverrides[ ii ] = ZLO_NONE; + m_zoneLayerOverrides.fill( ZLO_NONE ); m_isFree = false; } diff --git a/pcbnew/pcb_track.h b/pcbnew/pcb_track.h index 4d61ae3574..6185c7d49c 100644 --- a/pcbnew/pcb_track.h +++ b/pcbnew/pcb_track.h @@ -37,6 +37,7 @@ #include +#include #include #include #include @@ -554,9 +555,8 @@ public: FLASHING aFlash = FLASHING::DEFAULT ) const override; void ClearZoneLayerOverrides() - { - for( size_t ii = 0; ii < arrayDim( m_zoneLayerOverrides ); ++ii ) - m_zoneLayerOverrides[ ii ] = ZLO_NONE; + { + m_zoneLayerOverrides.fill( ZLO_NONE ); } const ZONE_LAYER_OVERRIDE& GetZoneLayerOverride( PCB_LAYER_ID aLayer ) const @@ -587,8 +587,8 @@ private: bool m_keepStartEndLayer; ///< Keep the start and end annular rings bool m_isFree; ///< "Free" vias don't get their nets auto-updated - std::mutex m_zoneLayerOverridesMutex; - ZONE_LAYER_OVERRIDE m_zoneLayerOverrides[B_Cu + 1]; + std::mutex m_zoneLayerOverridesMutex; + std::array m_zoneLayerOverrides; }; diff --git a/pcbnew/plugins/kicad/pcb_parser.cpp b/pcbnew/plugins/kicad/pcb_parser.cpp index 6b91956328..a450323eb3 100644 --- a/pcbnew/plugins/kicad/pcb_parser.cpp +++ b/pcbnew/plugins/kicad/pcb_parser.cpp @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2012 CERN - * Copyright (C) 2012-2022 KiCad Developers, see AUTHORS.txt for contributors. + * Copyright (C) 2012-2023 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -5025,10 +5025,13 @@ PAD* PCB_PARSER::parsePAD( FOOTPRINT* aParent ) break; case T_zone_layer_connections: - for( PCB_LAYER_ID layer : pad->GetLayerSet().Seq() ) + { + LSET cuLayers = pad->GetLayerSet() & LSET::AllCuMask(); + + for( PCB_LAYER_ID layer : cuLayers.Seq() ) pad->SetZoneLayerOverride( layer, ZLO_FORCE_NO_ZONE_CONNECTION ); - for( token = NextTok(); token != T_RIGHT; token = NextTok() ) + for( token = NextTok(); token != T_RIGHT; token = NextTok() ) { PCB_LAYER_ID layer = lookUpLayer( m_layerIndices ); @@ -5039,6 +5042,7 @@ PAD* PCB_PARSER::parsePAD( FOOTPRINT* aParent ) } break; + } // Continue to process "(locked)" format which was output during 5.99 development case T_locked: