Skip to content

Commit

Permalink
fix(roaring64): add_bulk of existing values no longer reads OOB
Browse files Browse the repository at this point in the history
When the bulk context was null, it assumed there was no leaf at all, but that's
not nessisarily true.
  • Loading branch information
Dr-Emann committed Jan 14, 2024
1 parent f3ad2f2 commit 2bc727a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 8 deletions.
3 changes: 2 additions & 1 deletion src/roaring64.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,9 @@ void roaring64_bitmap_add_bulk(roaring64_bitmap_t *r,
} else {
// We're not positioned anywhere yet or the high bits of the key
// differ.
leaf_t *leaf = (leaf_t *)art_find(&r->art, high48);
context->leaf =
containerptr_roaring64_bitmap_add(r, high48, low16, NULL);
containerptr_roaring64_bitmap_add(r, high48, low16, leaf);
memcpy(context->high_bytes, high48, ART_KEY_BYTES);
}
}
Expand Down
28 changes: 21 additions & 7 deletions tests/roaring64_unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -148,16 +148,30 @@ DEFINE_TEST(test_add_bulk) {
}

DEFINE_TEST(test_add_many) {
roaring64_bitmap_t* r = roaring64_bitmap_create();
std::array<uint64_t, 1000> vals;
std::iota(vals.begin(), vals.end(), 0);
{
roaring64_bitmap_t* r = roaring64_bitmap_create();
std::array<uint64_t, 1000> vals;
std::iota(vals.begin(), vals.end(), 0);

roaring64_bitmap_add_many(r, vals.size(), vals.data());
for (uint64_t i = 0; i < 1000; ++i) {
assert_true(roaring64_bitmap_contains(r, vals[i]));
roaring64_bitmap_add_many(r, vals.size(), vals.data());
for (uint64_t i = 0; i < 1000; ++i) {
assert_true(roaring64_bitmap_contains(r, vals[i]));
}

roaring64_bitmap_free(r);
}

roaring64_bitmap_free(r);
{
// Add many_where value already exists
roaring64_bitmap_t* r = roaring64_bitmap_create();
uint64_t value = 0;
roaring64_bitmap_add(r, value);
assert_true(roaring64_bitmap_contains(r, value));
roaring64_bitmap_add_many(r, 1, &value);
assert_true(roaring64_bitmap_contains(r, value));
assert_int_equal(roaring64_bitmap_get_cardinality(r), 1);
roaring64_bitmap_free(r);
}
}

DEFINE_TEST(test_add_range_closed) {
Expand Down

0 comments on commit 2bc727a

Please sign in to comment.