Suggested fix of an overflow in vectors.

This commit is contained in:
Alan Mishchenko 2025-02-23 13:17:51 -08:00
parent 9e35825e6b
commit 4f1b961d00
7 changed files with 31 additions and 18 deletions

View File

@ -80,6 +80,13 @@
#include <stdio.h>
#include <string.h>
#ifdef WIN32
#include <windows.h>
#define PATH_MAX MAX_PATH
#else
#include <limits.h>
#endif
// catch memory leaks in Visual Studio
#ifdef WIN32
#ifdef _DEBUG

View File

@ -350,6 +350,7 @@ static inline void Vec_BitGrow( Vec_Bit_t * p, int nCapMin )
{
if ( p->nCap >= nCapMin )
return;
assert( p->nCap < INT_MAX );
nCapMin = (nCapMin >> 5) + ((nCapMin & 31) > 0);
p->pArray = ABC_REALLOC( int, p->pArray, nCapMin );
assert( p->pArray );
@ -405,7 +406,7 @@ static inline void Vec_BitFillExtra( Vec_Bit_t * p, int nSize, int Fill )
if ( nSize > 2 * p->nCap )
Vec_BitGrow( p, nSize );
else if ( nSize > p->nCap )
Vec_BitGrow( p, 2 * p->nCap );
Vec_BitGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
assert( p->nSize < nSize );
if ( (p->nSize >> 5) == (nSize >> 5) )
@ -527,7 +528,7 @@ static inline void Vec_BitPush( Vec_Bit_t * p, int Entry )
if ( p->nCap < 16 )
Vec_BitGrow( p, 16 );
else
Vec_BitGrow( p, 2 * p->nCap );
Vec_BitGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
if ( Entry == 1 )
p->pArray[p->nSize >> 5] |= (1 << (p->nSize & 31));

View File

@ -454,6 +454,7 @@ static inline void Vec_FltGrow( Vec_Flt_t * p, int nCapMin )
{
if ( p->nCap >= nCapMin )
return;
assert( p->nCap < INT_MAX );
p->pArray = ABC_REALLOC( float, p->pArray, nCapMin );
p->nCap = nCapMin;
}
@ -497,7 +498,7 @@ static inline void Vec_FltFillExtra( Vec_Flt_t * p, int nSize, float Fill )
if ( nSize > 2 * p->nCap )
Vec_FltGrow( p, nSize );
else if ( nSize > p->nCap )
Vec_FltGrow( p, 2 * p->nCap );
Vec_FltGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
for ( i = p->nSize; i < nSize; i++ )
p->pArray[i] = Fill;
p->nSize = nSize;
@ -554,7 +555,7 @@ static inline void Vec_FltPush( Vec_Flt_t * p, float Entry )
if ( p->nCap < 16 )
Vec_FltGrow( p, 16 );
else
Vec_FltGrow( p, 2 * p->nCap );
Vec_FltGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
p->pArray[p->nSize++] = Entry;
}
@ -578,7 +579,7 @@ static inline void Vec_FltPushOrder( Vec_Flt_t * p, float Entry )
if ( p->nCap < 16 )
Vec_FltGrow( p, 16 );
else
Vec_FltGrow( p, 2 * p->nCap );
Vec_FltGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
p->nSize++;
for ( i = p->nSize-2; i >= 0; i-- )

View File

@ -552,6 +552,7 @@ static inline void Vec_IntGrow( Vec_Int_t * p, int nCapMin )
{
if ( p->nCap >= nCapMin )
return;
assert( p->nCap < INT_MAX );
p->pArray = ABC_REALLOC( int, p->pArray, nCapMin );
assert( p->pArray );
p->nCap = nCapMin;
@ -633,7 +634,7 @@ static inline void Vec_IntFillExtra( Vec_Int_t * p, int nSize, int Fill )
if ( nSize > 2 * p->nCap )
Vec_IntGrow( p, nSize );
else if ( nSize > p->nCap )
Vec_IntGrow( p, 2 * p->nCap );
Vec_IntGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
for ( i = p->nSize; i < nSize; i++ )
p->pArray[i] = Fill;
p->nSize = nSize;
@ -751,7 +752,7 @@ static inline void Vec_IntPush( Vec_Int_t * p, int Entry )
if ( p->nCap < 16 )
Vec_IntGrow( p, 16 );
else
Vec_IntGrow( p, 2 * p->nCap );
Vec_IntGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
p->pArray[p->nSize++] = Entry;
}
@ -810,7 +811,7 @@ static inline void Vec_IntPushFirst( Vec_Int_t * p, int Entry )
if ( p->nCap < 16 )
Vec_IntGrow( p, 16 );
else
Vec_IntGrow( p, 2 * p->nCap );
Vec_IntGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
p->nSize++;
for ( i = p->nSize - 1; i >= 1; i-- )
@ -837,7 +838,7 @@ static inline void Vec_IntPushOrder( Vec_Int_t * p, int Entry )
if ( p->nCap < 16 )
Vec_IntGrow( p, 16 );
else
Vec_IntGrow( p, 2 * p->nCap );
Vec_IntGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
p->nSize++;
for ( i = p->nSize-2; i >= 0; i-- )
@ -855,7 +856,7 @@ static inline void Vec_IntPushOrderCost( Vec_Int_t * p, int Entry, Vec_Int_t * v
if ( p->nCap < 16 )
Vec_IntGrow( p, 16 );
else
Vec_IntGrow( p, 2 * p->nCap );
Vec_IntGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
p->nSize++;
for ( i = p->nSize-2; i >= 0; i-- )
@ -931,7 +932,7 @@ static inline void Vec_IntPushOrderReverse( Vec_Int_t * p, int Entry )
if ( p->nCap < 16 )
Vec_IntGrow( p, 16 );
else
Vec_IntGrow( p, 2 * p->nCap );
Vec_IntGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
p->nSize++;
for ( i = p->nSize-2; i >= 0; i-- )

View File

@ -455,6 +455,7 @@ static inline void Vec_PtrGrow( Vec_Ptr_t * p, int nCapMin )
{
if ( p->nCap >= nCapMin )
return;
assert( p->nCap < INT_MAX );
p->pArray = ABC_REALLOC( void *, p->pArray, nCapMin );
p->nCap = nCapMin;
}
@ -506,7 +507,7 @@ static inline void Vec_PtrFillExtra( Vec_Ptr_t * p, int nSize, void * Fill )
if ( nSize > 2 * p->nCap )
Vec_PtrGrow( p, nSize );
else if ( nSize > p->nCap )
Vec_PtrGrow( p, 2 * p->nCap );
Vec_PtrGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
for ( i = p->nSize; i < nSize; i++ )
p->pArray[i] = Fill;
p->nSize = nSize;
@ -682,7 +683,7 @@ static inline void Vec_PtrPush( Vec_Ptr_t * p, void * Entry )
if ( p->nCap < 16 )
Vec_PtrGrow( p, 16 );
else
Vec_PtrGrow( p, 2 * p->nCap );
Vec_PtrGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
p->pArray[p->nSize++] = Entry;
}
@ -717,7 +718,7 @@ static inline void Vec_PtrPushFirst( Vec_Ptr_t * p, void * Entry )
if ( p->nCap < 16 )
Vec_PtrGrow( p, 16 );
else
Vec_PtrGrow( p, 2 * p->nCap );
Vec_PtrGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
p->nSize++;
for ( i = p->nSize - 1; i >= 1; i-- )

View File

@ -101,6 +101,7 @@ static inline void Vec_QueGrow( Vec_Que_t * p, int nCapMin )
{
if ( p->nCap >= nCapMin )
return;
assert( p->nCap < INT_MAX );
p->pHeap = ABC_REALLOC( int, p->pHeap, nCapMin );
p->pOrder = ABC_REALLOC( int, p->pOrder, nCapMin );
memset( p->pHeap + p->nCap, 0xff, (size_t)(nCapMin - p->nCap) * sizeof(int) );
@ -225,9 +226,9 @@ static inline int Vec_QueIsMember( Vec_Que_t * p, int v )
static inline void Vec_QuePush( Vec_Que_t * p, int v )
{
if ( p->nSize >= p->nCap )
Vec_QueGrow( p, Abc_MaxInt(p->nSize+1, 2*p->nCap) );
Vec_QueGrow( p, Abc_MaxInt(p->nSize+1, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX) );
if ( v >= p->nCap )
Vec_QueGrow( p, Abc_MaxInt(v+1, 2*p->nCap) );
Vec_QueGrow( p, Abc_MaxInt(v+1, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX) );
assert( p->nSize < p->nCap );
assert( p->pOrder[v] == -1 );
assert( p->pHeap[p->nSize] == -1 );

View File

@ -423,6 +423,7 @@ static inline void Vec_StrGrow( Vec_Str_t * p, int nCapMin )
{
if ( p->nCap >= nCapMin )
return;
assert( p->nCap < INT_MAX );
p->pArray = ABC_REALLOC( char, p->pArray, nCapMin );
p->nCap = nCapMin;
}
@ -466,7 +467,7 @@ static inline void Vec_StrFillExtra( Vec_Str_t * p, int nSize, char Fill )
if ( nSize > 2 * p->nCap )
Vec_StrGrow( p, nSize );
else if ( nSize > p->nCap )
Vec_StrGrow( p, 2 * p->nCap );
Vec_StrGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
for ( i = p->nSize; i < nSize; i++ )
p->pArray[i] = Fill;
p->nSize = nSize;
@ -557,7 +558,7 @@ static inline void Vec_StrPush( Vec_Str_t * p, char Entry )
if ( p->nCap < 16 )
Vec_StrGrow( p, 16 );
else
Vec_StrGrow( p, 2 * p->nCap );
Vec_StrGrow( p, p->nCap < INT_MAX/2 ? 2 * p->nCap : INT_MAX );
}
p->pArray[p->nSize++] = Entry;
}