Check for BitVector capacity overflow
The actual capacity of a BitVector is rounded up to the next multiple
of eight, so capacity must not be larger than (SIZE_MAX - 7).
diff --git a/core/Lucy/Object/BitVector.c b/core/Lucy/Object/BitVector.c
index e340e18..202475a 100644
--- a/core/Lucy/Object/BitVector.c
+++ b/core/Lucy/Object/BitVector.c
@@ -48,8 +48,7 @@
static CFISH_INLINE size_t
SI_octet_size(size_t bit_size) {
- if (bit_size == 0) { return 0; }
- return (bit_size - 1) / 8 + 1;
+ return (bit_size + 7) / 8;
}
BitVector*
@@ -61,6 +60,10 @@
BitVector*
BitVec_init(BitVector *self, size_t capacity) {
BitVectorIVARS *const ivars = BitVec_IVARS(self);
+
+ if (capacity > SIZE_MAX - 7) {
+ THROW(ERR, "BitVector capacity too large");
+ }
const size_t byte_size = SI_octet_size(capacity);
// Derive.
@@ -130,6 +133,9 @@
BitVec_Grow_IMP(BitVector *self, size_t capacity) {
BitVectorIVARS *const ivars = BitVec_IVARS(self);
if (capacity > ivars->cap) {
+ if (capacity > SIZE_MAX - 7) {
+ THROW(ERR, "BitVector capacity overflow");
+ }
const size_t old_byte_cap = SI_octet_size(ivars->cap);
const size_t new_byte_cap = SI_octet_size(capacity);
const size_t num_new_bytes = new_byte_cap - old_byte_cap;