diff --git a/src/roaring_array.c b/src/roaring_array.c index bff88f39b..b547cf85b 100644 --- a/src/roaring_array.c +++ b/src/roaring_array.c @@ -76,7 +76,10 @@ bool ra_init_with_capacity(roaring_array_t *new_ra, uint32_t cap) { if (!new_ra) return false; ra_init(new_ra); - if (cap > INT32_MAX) { return false; } + // Containers hold 64Ki elements, so 64Ki containers is enough to hold `0x10000 * 0x10000` (all 2^32) elements + if (cap > 0x10000) { + cap = 0x10000; + } if(cap > 0) { void *bigalloc = roaring_malloc(cap * diff --git a/tests/toplevel_unit.c b/tests/toplevel_unit.c index 4d50fc51d..9697e2d28 100644 --- a/tests/toplevel_unit.c +++ b/tests/toplevel_unit.c @@ -532,6 +532,13 @@ DEFINE_TEST(test_stats) { roaring_bitmap_free(r1); } +DEFINE_TEST(with_huge_capacity) { + roaring_bitmap_t *r = roaring_bitmap_create_with_capacity(UINT32_MAX); + assert_non_null(r); + assert_int_equal(r->high_low_container.allocation_size, (1 << 16)); + roaring_bitmap_free(r); +} + // this should expose memory leaks // (https://github.com/RoaringBitmap/CRoaring/pull/70) void leaks_with_empty(bool copy_on_write) { @@ -4623,6 +4630,7 @@ int main() { cmocka_unit_test(test_silly_range), cmocka_unit_test(test_uint32_iterator_true), cmocka_unit_test(test_uint32_iterator_false), + cmocka_unit_test(with_huge_capacity), cmocka_unit_test(leaks_with_empty_true), cmocka_unit_test(leaks_with_empty_false), cmocka_unit_test(test_bitmap_from_range),