From fd66ea669c131f660799bb6f9ea9988a17cd03ef Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Tue, 18 Sep 2012 17:20:03 -0600 Subject: [PATCH] bitmap: fix problems in previous commit Commit ee3d3893 missed the fact that (unsigned char)<<(int) is truncated to int, and therefore failed for any bitmap data longer than four bytes. Also, I failed to run 'make syntax-check' on my commit 4bba6579; for whatever odd reason, ffs lives in a different header than ffsl. * src/util/bitmap.c (virBitmapNewData): Use correct shift type. (includes): Glibc (and therefore gnulib) decided ffs is in , but ffsl is in . * tests/virbitmaptest.c (test5): Test it. --- src/util/bitmap.c | 3 +-- tests/virbitmaptest.c | 12 +++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/util/bitmap.c b/src/util/bitmap.c index 4bade6cbde..9ca1af88aa 100644 --- a/src/util/bitmap.c +++ b/src/util/bitmap.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include @@ -434,7 +433,7 @@ virBitmapPtr virBitmapNewData(void *data, int len) j = 0; p++; } - *p |= bytes[i] << (j * CHAR_BIT); + *p |= (unsigned long) bytes[i] << (j * CHAR_BIT); } return bitmap; diff --git a/tests/virbitmaptest.c b/tests/virbitmaptest.c index 028556f065..71836def68 100644 --- a/tests/virbitmaptest.c +++ b/tests/virbitmaptest.c @@ -214,15 +214,15 @@ error: /* test for virBitmapNewData/ToData */ static int test5(const void *v ATTRIBUTE_UNUSED) { - char data[] = {0x01, 0x02, 0x00, 0x00}; + char data[] = {0x01, 0x02, 0x00, 0x00, 0x04}; unsigned char *data2 = NULL; int len2; - int bits[] = {0, 9}; + int bits[] = {0, 9, 34}; virBitmapPtr bitmap; int i, j; int ret = -1; - bitmap = virBitmapNewData(data, 4); + bitmap = virBitmapNewData(data, sizeof(data)); if (!bitmap) goto error; @@ -242,10 +242,12 @@ static int test5(const void *v ATTRIBUTE_UNUSED) if (virBitmapToData(bitmap, &data2, &len2) < 0) goto error; - if (data2[0] != 0x05 || + if (len2 != sizeof(data) || + data2[0] != 0x05 || data2[1] != 0x82 || data2[2] != 0x00 || - data2[3] != 0x00) + data2[3] != 0x00 || + data2[4] != 0x04) goto error; ret = 0;