Skip to content

Commit ac139ab

Browse files
committed
safer deserialization.
1 parent eeb05ec commit ac139ab

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

pyroaring/abstract_bitmap.pxi

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,18 @@ try:
1212
except NameError: # python 3
1313
pass
1414

15-
cdef croaring.roaring_bitmap_t *deserialize_ptr(char *buff):
15+
cdef croaring.roaring_bitmap_t *deserialize_ptr(bytes buff):
1616
cdef croaring.roaring_bitmap_t *ptr
17-
ptr = croaring.roaring_bitmap_portable_deserialize(buff)
17+
cdef const char *reason_failure = NULL
18+
buff_size = len(buff)
19+
ptr = croaring.roaring_bitmap_portable_deserialize_safe(buff, buff_size)
20+
if ptr == NULL:
21+
raise ValueError("Could not deserialize bitmap!!")
22+
# Validate the bitmap
23+
if not croaring.roaring_bitmap_internal_validate(ptr, &reason_failure):
24+
# If validation fails, free the bitmap and raise an exception
25+
croaring.roaring_bitmap_free(ptr)
26+
raise ValueError(f"Invalid bitmap: {reason_failure.decode('utf-8')}")
1827
return ptr
1928

2029
cdef croaring.roaring64_bitmap_t *deserialize64_ptr(bytes buff):
@@ -744,7 +753,7 @@ cdef class AbstractBitMap:
744753

745754

746755
@classmethod
747-
def deserialize(cls, char *buff):
756+
def deserialize(cls, bytes buff):
748757
"""
749758
Generate a bitmap from the given serialization. See AbstractBitMap.serialize for the reverse operation.
750759

pyroaring/croaring.pxd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ cdef extern from "roaring.h":
100100
size_t roaring_bitmap_portable_size_in_bytes(const roaring_bitmap_t *ra)
101101
size_t roaring_bitmap_portable_serialize(const roaring_bitmap_t *ra, char *buf)
102102
roaring_bitmap_t *roaring_bitmap_portable_deserialize(const char *buf)
103+
roaring_bitmap_t *roaring_bitmap_portable_deserialize_safe(const char *buf, size_t maxbytes)
104+
bool roaring_bitmap_internal_validate(const roaring_bitmap_t *r, const char **reason)
103105
roaring_uint32_iterator_t *roaring_iterator_create(const roaring_bitmap_t *ra)
104106
bool roaring_uint32_iterator_advance(roaring_uint32_iterator_t *it)
105107
uint32_t roaring_uint32_iterator_read(roaring_uint32_iterator_t *it, uint32_t* buf, uint32_t count)

0 commit comments

Comments
 (0)