@@ -1045,6 +1045,11 @@ static FORCE_INLINE char *doAllocStr(HeapPages *pages, int64_t len, Error *error
1045
1045
{
1046
1046
StrDimensions dims = {.len = len , .capacity = 2 * (len + 1 )};
1047
1047
1048
+ if (dims .capacity > INT_MAX - MEM_MIN_FREE_HEAP )
1049
+ dims .capacity = INT_MAX - MEM_MIN_FREE_HEAP ;
1050
+ if (dims .capacity < dims .len )
1051
+ dims .capacity = dims .len ;
1052
+
1048
1053
char * dimsAndData = chunkAlloc (pages , sizeof (StrDimensions ) + dims .capacity , NULL , NULL , false, error );
1049
1054
* (StrDimensions * )dimsAndData = dims ;
1050
1055
@@ -1076,6 +1081,11 @@ static FORCE_INLINE void doAllocDynArray(HeapPages *pages, DynArray *array, Type
1076
1081
1077
1082
DynArrayDimensions dims = {.len = len , .capacity = 2 * (len + 1 )};
1078
1083
1084
+ if (dims .capacity * array -> itemSize > INT_MAX - MEM_MIN_FREE_HEAP )
1085
+ dims .capacity = (INT_MAX - MEM_MIN_FREE_HEAP ) / array -> itemSize ;
1086
+ if (dims .capacity < dims .len )
1087
+ dims .capacity = dims .len ;
1088
+
1079
1089
char * dimsAndData = chunkAlloc (pages , sizeof (DynArrayDimensions ) + dims .capacity * array -> itemSize , array -> type , NULL , false, error );
1080
1090
* (DynArrayDimensions * )dimsAndData = dims ;
1081
1091
@@ -2018,7 +2028,7 @@ static FORCE_INLINE void doBuiltinMake(Fiber *fiber, HeapPages *pages, Error *er
2018
2028
if (type -> kind == TYPE_DYNARRAY )
2019
2029
{
2020
2030
DynArray * result = (DynArray * )(fiber -> top ++ )-> ptrVal ;
2021
- int len = (fiber -> top ++ )-> intVal ;
2031
+ int64_t len = (fiber -> top ++ )-> intVal ;
2022
2032
2023
2033
doAllocDynArray (pages , result , type , len , error );
2024
2034
(-- fiber -> top )-> ptrVal = result ;
@@ -2046,7 +2056,7 @@ static FORCE_INLINE void doBuiltinMake(Fiber *fiber, HeapPages *pages, Error *er
2046
2056
static FORCE_INLINE void doBuiltinMakefromarr (Fiber * fiber , HeapPages * pages , Error * error )
2047
2057
{
2048
2058
DynArray * dest = (DynArray * )(fiber -> top ++ )-> ptrVal ;
2049
- int len = (fiber -> top ++ )-> intVal ;
2059
+ int64_t len = (fiber -> top ++ )-> intVal ;
2050
2060
void * src = (fiber -> top ++ )-> ptrVal ;
2051
2061
2052
2062
Type * destType = fiber -> code [fiber -> ip ].type ;
@@ -2136,7 +2146,7 @@ static FORCE_INLINE void doBuiltinMaketostr(Fiber *fiber, HeapPages *pages, Erro
2136
2146
2137
2147
if (src -> data )
2138
2148
{
2139
- const int len = strlen ((const char * )src -> data );
2149
+ const int64_t len = strlen ((const char * )src -> data );
2140
2150
dest = doAllocStr (pages , len , error );
2141
2151
memcpy (dest , src -> data , len );
2142
2152
}
@@ -3368,7 +3378,7 @@ static FORCE_INLINE void doGetDynArrayPtr(Fiber *fiber, Error *error)
3368
3378
error -> runtimeHandler (error -> context , ERR_RUNTIME , "Dynamic array is null" );
3369
3379
3370
3380
int itemSize = array -> itemSize ;
3371
- int len = getDims (array )-> len ;
3381
+ int64_t len = getDims (array )-> len ;
3372
3382
3373
3383
if (index < 0 || index > len - 1 )
3374
3384
error -> runtimeHandler (error -> context , ERR_RUNTIME , "Index %d is out of range 0...%d" , index , len - 1 );
0 commit comments