From 4f1b961d004268d8fb1c2ec941fd40258901ca30 Mon Sep 17 00:00:00 2001 From: Alan Mishchenko Date: Sun, 23 Feb 2025 13:17:51 -0800 Subject: [PATCH] Suggested fix of an overflow in vectors. --- src/misc/util/abc_global.h | 7 +++++++ src/misc/vec/vecBit.h | 5 +++-- src/misc/vec/vecFlt.h | 7 ++++--- src/misc/vec/vecInt.h | 13 +++++++------ src/misc/vec/vecPtr.h | 7 ++++--- src/misc/vec/vecQue.h | 5 +++-- src/misc/vec/vecStr.h | 5 +++-- 7 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/misc/util/abc_global.h b/src/misc/util/abc_global.h index 4bc3c1c15..dd2ebd05c 100644 --- a/src/misc/util/abc_global.h +++ b/src/misc/util/abc_global.h @@ -80,6 +80,13 @@ #include #include +#ifdef WIN32 +#include +#define PATH_MAX MAX_PATH +#else +#include +#endif + // catch memory leaks in Visual Studio #ifdef WIN32 #ifdef _DEBUG diff --git a/src/misc/vec/vecBit.h b/src/misc/vec/vecBit.h index 9b0af9d94..735e4bb9e 100644 --- a/src/misc/vec/vecBit.h +++ b/src/misc/vec/vecBit.h @@ -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)); diff --git a/src/misc/vec/vecFlt.h b/src/misc/vec/vecFlt.h index ea43ae24e..9b21ee066 100644 --- a/src/misc/vec/vecFlt.h +++ b/src/misc/vec/vecFlt.h @@ -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-- ) diff --git a/src/misc/vec/vecInt.h b/src/misc/vec/vecInt.h index 0b1ae6d30..9daf7e064 100644 --- a/src/misc/vec/vecInt.h +++ b/src/misc/vec/vecInt.h @@ -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-- ) diff --git a/src/misc/vec/vecPtr.h b/src/misc/vec/vecPtr.h index 0f024f687..e2d6a8de0 100644 --- a/src/misc/vec/vecPtr.h +++ b/src/misc/vec/vecPtr.h @@ -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-- ) diff --git a/src/misc/vec/vecQue.h b/src/misc/vec/vecQue.h index 6a8a68d05..ae394a9fd 100644 --- a/src/misc/vec/vecQue.h +++ b/src/misc/vec/vecQue.h @@ -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 ); diff --git a/src/misc/vec/vecStr.h b/src/misc/vec/vecStr.h index 16e157619..ced39b0dc 100644 --- a/src/misc/vec/vecStr.h +++ b/src/misc/vec/vecStr.h @@ -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; }