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
This commit is contained in:
Alex 2023-02-08 01:32:19 +03:00
parent 3d23d0e16a
commit b71fa91bc4
5 changed files with 18 additions and 16 deletions

View File

@ -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 );
}

View File

@ -26,6 +26,7 @@
#define PAD_H
#include <mutex>
#include <array>
#include <zones.h>
#include <board_connected_item.h>
#include <geometry/shape_poly_set.h>
@ -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
@ -875,7 +875,7 @@ private:
int m_thermalGap;
std::mutex m_zoneLayerOverridesMutex;
ZONE_LAYER_OVERRIDE m_zoneLayerOverrides[B_Cu + 1];
std::array<ZONE_LAYER_OVERRIDE, MAX_CU_LAYERS> m_zoneLayerOverrides;
};
#endif // PAD_H

View File

@ -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;
}

View File

@ -37,6 +37,7 @@
#include <mutex>
#include <array>
#include <board_connected_item.h>
#include <base_units.h>
#include <geometry/shape_segment.h>
@ -555,8 +556,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
@ -588,7 +588,7 @@ private:
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::array<ZONE_LAYER_OVERRIDE, MAX_CU_LAYERS> m_zoneLayerOverrides;
};

View File

@ -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,7 +5025,10 @@ 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() )
@ -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: