diff options
author | dimitri staessens <[email protected]> | 2017-05-24 13:15:38 +0000 |
---|---|---|
committer | Sander Vrijders <[email protected]> | 2017-05-24 13:15:38 +0000 |
commit | f986d188898f8b7cd6db3442d29728ca78dad76e (patch) | |
tree | 03ffb3b0b75affb94eba78408c161dba0494f94a | |
parent | be49633c7069c2a2273add8c1dd0425a8f25dd1e (diff) | |
parent | a3ede18c5d3e652e9d0bade4b28193e666198574 (diff) | |
download | ouroboros-f986d188898f8b7cd6db3442d29728ca78dad76e.tar.gz ouroboros-f986d188898f8b7cd6db3442d29728ca78dad76e.zip |
Merged in dstaesse/ouroboros/be-lib-bitmap (pull request #511)
lib: Fix bug in bitmap
-rw-r--r-- | src/lib/bitmap.c | 11 | ||||
-rw-r--r-- | src/lib/tests/bitmap_test.c | 15 |
2 files changed, 18 insertions, 8 deletions
diff --git a/src/lib/bitmap.c b/src/lib/bitmap.c index bf9bb99d..ec663ec7 100644 --- a/src/lib/bitmap.c +++ b/src/lib/bitmap.c @@ -50,7 +50,7 @@ static size_t find_next_zero_bit(const size_t * addr, tmp = ~addr[start]; while (!tmp) { start++; - if (start >= (nbits / BITS_PER_LONG)) + if (start >= DIV_ROUND_UP(nbits, BITS_PER_LONG)) return nbits; tmp = ~addr[start]; @@ -69,8 +69,7 @@ static size_t find_next_zero_bit(const size_t * addr, static void bitmap_zero(size_t * dst, size_t nbits) { - size_t len = BITS_TO_LONGS(nbits) * sizeof(size_t); - memset(dst, 0, len); + memset(dst, 0, BITS_TO_LONGS(nbits) * sizeof(size_t)); } static void bitmap_clear(size_t * map, @@ -92,8 +91,8 @@ static void bitmap_set(size_t * map, } struct bmp { - ssize_t offset; - size_t size; + ssize_t offset; + size_t size; size_t * bitmap; }; @@ -116,7 +115,7 @@ struct bmp * bmp_create(size_t bits, return NULL; } - tmp->size = bits; + tmp->size = bits; tmp->offset = offset; bitmap_zero(tmp->bitmap, bits); diff --git a/src/lib/tests/bitmap_test.c b/src/lib/tests/bitmap_test.c index e438f217..4f58de3b 100644 --- a/src/lib/tests/bitmap_test.c +++ b/src/lib/tests/bitmap_test.c @@ -30,7 +30,7 @@ int bitmap_test(int argc, char ** argv) { struct bmp * bmp; - size_t bits = BITMAP_SIZE; + ssize_t bits = BITMAP_SIZE; ssize_t id; int i; ssize_t r; @@ -57,8 +57,19 @@ int bitmap_test(int argc, char ** argv) for (i = offset; i < BITMAP_SIZE + 5 + offset; i++) { id = bmp_allocate(bmp); - if (!bmp_is_id_valid(bmp, id)) + if (!bmp_is_id_valid(bmp, id)) { + if (i < BITMAP_SIZE + offset) { + printf("Failed valid ID %d (%zd).\n", i, id); + bmp_destroy(bmp); + return -1; + } + if (id >= offset && id < bits + offset) { + printf("Valid ID %zd returned invalid.\n", id); + bmp_destroy(bmp); + return -1; + } continue; + } if (!bmp_is_id_used(bmp, id)) { printf("ID not marked in use.\n"); |