7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-21 00:21:25 +00:00

Fix OOB access in LSET when opening a PCB file or updating from schematic.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/18422
This commit is contained in:
Alex Shvartzkop 2024-07-23 01:40:56 +03:00
parent 559854ec0f
commit e2bd76bdce
4 changed files with 13 additions and 6 deletions
common
include
qa/tests/common

View File

@ -41,14 +41,15 @@
LSET::LSET( std::initializer_list<PCB_LAYER_ID> aList ) :
BASE_SET()
LSET()
{
for( PCB_LAYER_ID layer : aList )
set( layer );
}
LSET::LSET( const LSEQ& aSeq )
LSET::LSET( const LSEQ& aSeq ) :
LSET()
{
for( PCB_LAYER_ID layer : aSeq )
set( layer );

View File

@ -42,7 +42,7 @@ public:
using iterator = std::vector<int>::iterator;
using const_iterator = std::vector<int>::const_iterator;
BASE_SET( size_t size = 64 ) : m_bits( size, 0 ) {}
BASE_SET( size_t size ) : m_bits( size, 0 ) {}
bool test( size_t pos ) const
{
@ -173,6 +173,8 @@ public:
// Boolean operators
BASE_SET& operator&=( const BASE_SET& rhs )
{
assert( m_bits.size() == rhs.m_bits.size() );
for( size_t i = 0; i < m_bits.size(); ++i )
m_bits[i] &= rhs.m_bits[i];
@ -181,6 +183,8 @@ public:
BASE_SET& operator|=( const BASE_SET& rhs )
{
assert( m_bits.size() == rhs.m_bits.size() );
for( size_t i = 0; i < m_bits.size(); ++i )
m_bits[i] |= rhs.m_bits[i];
@ -189,6 +193,8 @@ public:
BASE_SET& operator^=( const BASE_SET& rhs )
{
assert( m_bits.size() == rhs.m_bits.size() );
for( size_t i = 0; i < m_bits.size(); ++i )
m_bits[i] ^= rhs.m_bits[i];

View File

@ -49,7 +49,7 @@ public:
* Create an empty (cleared) set.
*/
LSET() :
BASE_SET(PCB_LAYER_ID_COUNT) // all bits are set to zero in BASE_SET()
BASE_SET( PCB_LAYER_ID_COUNT ) // all bits are set to zero in BASE_SET()
{
}
@ -59,7 +59,7 @@ public:
}
LSET( PCB_LAYER_ID aLayer ) :
BASE_SET(PCB_LAYER_ID_COUNT)
BASE_SET( PCB_LAYER_ID_COUNT )
{
set( aLayer );
}

View File

@ -38,7 +38,7 @@ BOOST_AUTO_TEST_CASE(LSETConstructorEmpty)
// Initialize LSET from another BASE_SET
BOOST_AUTO_TEST_CASE(LSETConstructorFromBaseSet)
{
BASE_SET base;
BASE_SET base( PCB_LAYER_ID_COUNT );
base.set(F_Cu);
base.set(In1_Cu);