From: Jeremy Fitzhardinge Date: Wed, 30 Oct 2013 17:38:08 +0000 (-0700) Subject: libxl: fix dubious cpumask handling in libxlDomainSetVcpuAffinities X-Git-Tag: v1.1.4~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ba1bf10063a0205c1de12b209b0282833710214f;p=thirdparty%2Flibvirt.git libxl: fix dubious cpumask handling in libxlDomainSetVcpuAffinities Rather than casting the virBitmap pointer to uint8_t* and then using the structure contents as a byte array, use the virBitmap API to determine the bitmap size and test each bit. Signed-off-by: Jeremy Fitzhardinge --- diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 6aab11fd7f..3c3e21b381 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -448,7 +448,7 @@ libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, virDomainObjPtr vm) libxlDomainObjPrivatePtr priv = vm->privateData; virDomainDefPtr def = vm->def; libxl_bitmap map; - uint8_t *cpumask = NULL; + virBitmapPtr cpumask = NULL; uint8_t *cpumap = NULL; virNodeInfo nodeinfo; size_t cpumaplen; @@ -468,10 +468,12 @@ libxlDomainSetVcpuAffinities(libxlDriverPrivatePtr driver, virDomainObjPtr vm) if (VIR_ALLOC_N(cpumap, cpumaplen) < 0) goto cleanup; - cpumask = (uint8_t*) def->cputune.vcpupin[vcpu]->cpumask; + cpumask = def->cputune.vcpupin[vcpu]->cpumask; - for (i = 0; i < VIR_DOMAIN_CPUMASK_LEN; ++i) { - if (cpumask[i]) + for (i = 0; i < virBitmapSize(cpumask); ++i) { + bool bit; + ignore_value(virBitmapGetBit(cpumask, i, &bit)); + if (bit) VIR_USE_CPU(cpumap, i); }