check created bitarr size for overflow
This commit is contained in:
parent
56cbe4aa03
commit
d1f66dc75b
@ -60,20 +60,31 @@ static inline u64 bit_find(u64* arr, u64 ia, bool v) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// BitArr
|
// 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))
|
#define BITARR_SZ(IA) fsizeof(BitArr, a, u64, BIT_N(IA))
|
||||||
static B m_bitarrv(u64** p, usz ia) {
|
static B m_bitarrv(u64** p, usz ia) {
|
||||||
|
CHECK_BITARR_IA(ia);
|
||||||
BitArr* r = m_arr(BITARR_SZ(ia), t_bitarr, ia);
|
BitArr* r = m_arr(BITARR_SZ(ia), t_bitarr, ia);
|
||||||
arr_shVec((Arr*)r);
|
arr_shVec((Arr*)r);
|
||||||
*p = (u64*)r->a;
|
*p = (u64*)r->a;
|
||||||
return taga(r);
|
return taga(r);
|
||||||
}
|
}
|
||||||
static B m_bitarrc(u64** p, B x) { assert(isArr(x));
|
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));
|
BitArr* r = m_arr(BITARR_SZ(IA(x)), t_bitarr, IA(x));
|
||||||
*p = (u64*)r->a;
|
*p = (u64*)r->a;
|
||||||
arr_shCopy((Arr*)r, x);
|
arr_shCopy((Arr*)r, x);
|
||||||
return taga(r);
|
return taga(r);
|
||||||
}
|
}
|
||||||
static Arr* m_bitarrp(u64** p, usz ia) {
|
static Arr* m_bitarrp(u64** p, usz ia) {
|
||||||
|
CHECK_BITARR_IA(ia);
|
||||||
BitArr* r = m_arr(BITARR_SZ(ia), t_bitarr, ia);
|
BitArr* r = m_arr(BITARR_SZ(ia), t_bitarr, ia);
|
||||||
*p = (u64*)r->a;
|
*p = (u64*)r->a;
|
||||||
return (Arr*)r;
|
return (Arr*)r;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user