From 752e2bdbd2caaba44846fb00b5f5ae90546b0c6a Mon Sep 17 00:00:00 2001
From: Arne Goedeke <el@laramies.com>
Date: Tue, 8 Sep 2015 10:39:34 +0200
Subject: [PATCH] block_allocator: fixed a bug in ba_sort_free_list
This could possibly happen after syntax errors when freeing
the compiler data.
---
src/block_allocator.c | 35 +++++++++++++++++++++++------------
1 file changed, 23 insertions(+), 12 deletions(-)
diff --git a/src/block_allocator.c b/src/block_allocator.c
index 7099dca615..2644e0b47c 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;
--
GitLab