mirror of https://github.com/YosysHQ/abc.git
Suggested fix of an overflow in vectors.
This commit is contained in:
parent
9e35825e6b
commit
4f1b961d00
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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-- )
|
||||
|
|
|
|||
|
|
@ -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-- )
|
||||
|
|
|
|||
|
|
@ -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-- )
|
||||
|
|
|
|||
|
|
@ -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 );
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue