diff --git a/src/block_allocator.c b/src/block_allocator.c index 7099dca6157265967434c79dfffa99b1ad3b45df..2644e0b47c29e58e5993c9430130db1ad9063e87 100644 --- a/src/block_allocator.c +++ b/src/block_allocator.c @@ -425,21 +425,32 @@ static INLINE int bv_get(struct bitvector * bv, size_t n) { } static size_t bv_ctz(struct bitvector * bv, size_t n) { - size_t bit = n % BV_LENGTH; - size_t c = n / BV_LENGTH; - bv_int_t * _v = bv->v + c; - bv_int_t V = *_v & (~BV_NIL << bit); - - bit = c * BV_LENGTH; - - while (1) { - if (V) return bit + BV_CTZ(V); + size_t bit; + size_t c; + bv_int_t * _v; + bv_int_t V; + + if (n < bv->length) { + bit = n % BV_LENGTH; + c = n / BV_LENGTH; + _v = bv->v + c; + V = *_v & (~BV_NIL << bit); + + bit = c * BV_LENGTH; + + while (1) { + if (V) { + bit += BV_CTZ(V); + if (bit >= bv->length) break; + return bit; + } - bit += BV_LENGTH; + bit += BV_LENGTH; - if (bit >= bv->length) break; + if (bit >= bv->length) break; - V = *(++_v); + V = *(++_v); + } } return (size_t)-1;