]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
bitmap: fix problems in previous commit
authorEric Blake <eblake@redhat.com>
Tue, 18 Sep 2012 23:20:03 +0000 (17:20 -0600)
committerEric Blake <eblake@redhat.com>
Tue, 18 Sep 2012 23:47:06 +0000 (17:47 -0600)
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
<strings.h>, but ffsl is in <string.h>.
* tests/virbitmaptest.c (test5): Test it.

src/util/bitmap.c
tests/virbitmaptest.c

index 4bade6cbde56db819297e612d877063db4a6211d..9ca1af88aa260e5a32840515b584ff503f34cea6 100644 (file)
@@ -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;
index 028556f06511598b0f2514017a22606bb14baa1d..71836def68bcfccf0511d49b27297bc020164323 100644 (file)
@@ -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;