Commit ee3d3893 missed the fact that (unsigned char)<<(int) is truncated to int, and therefore failed for any bitmap data longer than four bytes, but only on 64-bit platforms. 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 <strings.h>, but ffsl is in <string.h>. * 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 4bade6c..9ca1af8 100644 --- a/src/util/bitmap.c +++ b/src/util/bitmap.c @@ -27,7 +27,6 @@ #include <stdint.h> #include <stdio.h> #include <string.h> -#include <strings.h> #include <stdlib.h> #include <sys/types.h> @@ -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 028556f..71836de 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; -- 1.7.11.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list