提交 4a41cf18 编写于 作者: J Ján Tomko

util: fix off-by-one when expanding a bitmap

To make sure bit 'b' fits into the bitmap, we need to allocate b+1
bits, since we number from 0.

Adjust the bitmap test to set a bit at a multiple of 16.
That way the test fails without this fix, because the VIR_REALLOC
call clears the newly added memory even if the original pointer
has not changed.
上级 5d82a208
...@@ -187,7 +187,7 @@ int virBitmapSetBit(virBitmapPtr bitmap, size_t b) ...@@ -187,7 +187,7 @@ int virBitmapSetBit(virBitmapPtr bitmap, size_t b)
*/ */
static int virBitmapExpand(virBitmapPtr map, size_t b) static int virBitmapExpand(virBitmapPtr map, size_t b)
{ {
size_t new_len = VIR_DIV_UP(b, VIR_BITMAP_BITS_PER_UNIT); size_t new_len = VIR_DIV_UP(b + 1, VIR_BITMAP_BITS_PER_UNIT);
/* resize the memory if necessary */ /* resize the memory if necessary */
if (map->map_len < new_len) { if (map->map_len < new_len) {
......
...@@ -639,15 +639,15 @@ test12(const void *opaque ATTRIBUTE_UNUSED) ...@@ -639,15 +639,15 @@ test12(const void *opaque ATTRIBUTE_UNUSED)
TEST_MAP(0, ""); TEST_MAP(0, "");
if (virBitmapSetBitExpand(map, 100) < 0) if (virBitmapSetBitExpand(map, 128) < 0)
goto cleanup; goto cleanup;
TEST_MAP(101, "100"); TEST_MAP(129, "128");
if (virBitmapClearBitExpand(map, 150) < 0) if (virBitmapClearBitExpand(map, 150) < 0)
goto cleanup; goto cleanup;
TEST_MAP(151, "100"); TEST_MAP(151, "128");
virBitmapFree(map); virBitmapFree(map);
if (virBitmapParseUnlimited("34,1023", &map) < 0) if (virBitmapParseUnlimited("34,1023", &map) < 0)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册