|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.5 v2 2/2] tools/[lib]xl: Fix `xl vcpu-list` when domains without vcpus exist
On Mon, Oct 20, 2014 at 05:38:54PM +0100, Andrew Cooper wrote:
> On a system which looks like this:
>
> [root@st04 ~]# xl list
> Name ID Mem VCPUs State
> Time(s)
> Domain-0 0 752 4 r-----
> 46699.3
> (null) 1 0 0 --p---
> 0.0
> (null) 2 0 0 --p---
> 0.0
> (null) 3 0 0 --p---
> 0.0
> badger 25 0 1 --p---
> 0.0
>
> `xl vcpu-list` failes as so:
>
> [root@st04 ~]# xl vcpu-list
> Name ID VCPU CPU State Time(s) CPU
> Affinity
> Domain-0 0 0 0 -b- 12171.0 all
> Domain-0 0 1 1 -b- 11779.6 all
> Domain-0 0 2 2 -b- 11599.0 all
> Domain-0 0 3 3 r-- 11007.0 all
> libxl: critical: libxl__calloc: libxl: FATAL ERROR: memory allocation failure
> (libxl__calloc, 4294935299 x 40)
> : Cannot allocate memory
> libxl: FATAL ERROR: memory allocation failure (libxl__calloc, 4294935299 x 40)
>
> The root cause of this is that, in the case that a domain has no vcpus,
> libxl_list_vcpu() attempts to calloc() with domaininfo.max_vcpu_id, which
> is uninitialised on the stack.
>
> Check domaininfo.max_vcpu_id against the new sentinel value
> XEN_INVALID_MAX_VCPU_ID (introduced in the previous patch), and return early.
> This means that it is now valid for libxl_list_vcpu() to return NULL for a
> domain which lacks any vcpus.
>
> As part of this change, remove the pointless call to libxl_get_max_cpus(),
> whose returned value is unconditionally clobbered in the for() loop.
>
> Reported-by: Euan Harris <euan.harris@xxxxxxxxxx>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> CC: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
> CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
>
> ---
> v2: s/nr_online_cpus/max_vcpu_id/g - I accidentally sent an unrefreshed patch
> ---
> tools/libxl/libxl.c | 8 +++++++-
> tools/libxl/xl_cmdimpl.c | 4 +---
> 2 files changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
> index f27b581..b7a9952 100644
> --- a/tools/libxl/libxl.c
> +++ b/tools/libxl/libxl.c
> @@ -5246,7 +5246,13 @@ libxl_vcpuinfo *libxl_list_vcpu(libxl_ctx *ctx,
> uint32_t domid,
> GC_FREE;
> return NULL;
> }
> - *nr_cpus_out = libxl_get_max_cpus(ctx);
> +
> + if (domaininfo.max_vcpu_id == XEN_INVALID_MAX_VCPU_ID) {
> + *nr_cpus_out = 0;
Do you not need to set nr_vcpus_out to 0 as well?
Wei.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |