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;