]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: bitmap: Don't alloc overly large binary bitmaps
authorPeter Krempa <pkrempa@redhat.com>
Thu, 2 Jul 2015 14:46:46 +0000 (16:46 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 8 Jul 2015 09:01:33 +0000 (11:01 +0200)
Optimize the virBitmap to array-of-char bitmap conversion by skipping
trailing zero bytes.

This also fixes a regression when requesting iothread information from a
live VM since after commit 825df8c3158cfaf5f398418471f10f4ff3c3515a the
bitmap returned from virProcessGetAffinity is too big to be formatted
properly via RPC. A user would get the following error:

error: Unable to get domain IOThreads information
error: Unable to encode message payload

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1238589

src/util/virbitmap.c

index 9abc8073dcca91b77eade1dee66b91b3ff2c2523..4d270a910c195d359e954537dadc4d482be52490 100644 (file)
@@ -498,9 +498,12 @@ virBitmapPtr virBitmapNewData(void *data, int len)
  */
 int virBitmapToData(virBitmapPtr bitmap, unsigned char **data, int *dataLen)
 {
-    int len;
+    ssize_t len;
 
-    len = (bitmap->max_bit + CHAR_BIT - 1) / CHAR_BIT;
+    if ((len = virBitmapLastSetBit(bitmap)) < 0)
+        len = 1;
+    else
+        len = (len + CHAR_BIT) / CHAR_BIT;
 
     if (VIR_ALLOC_N(*data, len) < 0)
         return -1;