From d1f66dc75b1b6714110f9346ee2b4504e4eea7dc Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 18 Nov 2023 19:56:39 +0200 Subject: [PATCH] check created bitarr size for overflow --- src/core/numarr.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/core/numarr.h b/src/core/numarr.h index bfab0591..bef7fae7 100644 --- a/src/core/numarr.h +++ b/src/core/numarr.h @@ -60,20 +60,31 @@ static inline u64 bit_find(u64* arr, u64 ia, bool v) { } // BitArr +#if UNSAFE_SIZES + #define CHECK_BITARR_IA(IA) +#elif USZ_64 + #define CHECK_BITARR_IA(IA) if ((IA) > USZ_MAX) thrOOM() +#else + #define CHECK_BITARR_IA(IA) if ((IA) > USZ_MAX-65) thrOOM() // make sure BIT_N doesn't overflow +#endif + #define BITARR_SZ(IA) fsizeof(BitArr, a, u64, BIT_N(IA)) static B m_bitarrv(u64** p, usz ia) { + CHECK_BITARR_IA(ia); BitArr* r = m_arr(BITARR_SZ(ia), t_bitarr, ia); arr_shVec((Arr*)r); *p = (u64*)r->a; return taga(r); } static B m_bitarrc(u64** p, B x) { assert(isArr(x)); + // no need for a CHECK_BITARR_IA, as bitarrs should have the least restrictive IA requirement BitArr* r = m_arr(BITARR_SZ(IA(x)), t_bitarr, IA(x)); *p = (u64*)r->a; arr_shCopy((Arr*)r, x); return taga(r); } static Arr* m_bitarrp(u64** p, usz ia) { + CHECK_BITARR_IA(ia); BitArr* r = m_arr(BITARR_SZ(ia), t_bitarr, ia); *p = (u64*)r->a; return (Arr*)r;