Skip to content

Commit 2ee133d

Browse files
authored
fix: check required alignment in roaring64_bitmap_frozen_view (#698)
If the alignment isn't respected, we'll end up padding to the wrong offsets, so just reject it outright.
1 parent fd520e1 commit 2ee133d

File tree

2 files changed

+6
-1
lines changed

2 files changed

+6
-1
lines changed

src/roaring64.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2420,6 +2420,9 @@ roaring64_bitmap_t *roaring64_bitmap_frozen_view(const char *buf,
24202420
if (buf == NULL) {
24212421
return NULL;
24222422
}
2423+
if ((uintptr_t)buf % CROARING_BITSET_ALIGNMENT != 0) {
2424+
return NULL;
2425+
}
24232426

24242427
roaring64_bitmap_t *r = roaring64_bitmap_create();
24252428

tests/roaring64_unit.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1546,10 +1546,12 @@ void check_frozen_serialization(roaring64_bitmap_t* r1) {
15461546
char* buf = (char*)roaring_aligned_malloc(64, serialized_size + 1);
15471547
size_t serialized = roaring64_bitmap_frozen_serialize(r1, buf + 1);
15481548
assert_int_equal(serialized, serialized_size);
1549+
// Cannot deserialize from an unaligned buffer.
1550+
assert_null(roaring64_bitmap_frozen_view(buf + 1, serialized_size));
15491551
memmove(buf, buf + 1, serialized_size);
15501552

15511553
roaring64_bitmap_t* r2 = roaring64_bitmap_frozen_view(buf, serialized_size);
1552-
assert_true(r2 != NULL);
1554+
assert_non_null(r2);
15531555
assert_r64_valid(r2);
15541556
assert_true(roaring64_bitmap_equals(r2, r1));
15551557

0 commit comments

Comments
 (0)