[libvirt] [PATCH 07/10] qemu: avoid memory leak on vcpupin

Daniel Veillard veillard at redhat.com
Fri Jun 3 00:57:15 UTC 2011


On Thu, Jun 02, 2011 at 05:07:59PM -0600, Eric Blake wrote:
> Detected by Coverity.  This leaked a cpumap on every iteration
> of the loop.  Leak introduced in commit 1cc4d02 (v0.9.0).
> 
> * src/qemu/qemu_process.c (qemuProcessSetVcpuAffinites): Plug
> leak, and hoist allocation outside loop.
> ---
>  src/qemu/qemu_process.c |   21 +++++++++++++--------
>  1 files changed, 13 insertions(+), 8 deletions(-)
> 
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 116253e..f175d50 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -1195,6 +1195,8 @@ qemuProcessSetVcpuAffinites(virConnectPtr conn,
>      pid_t vcpupid;
>      unsigned char *cpumask;
>      int vcpu, cpumaplen, hostcpus, maxcpu;
> +    unsigned char *cpumap = NULL;
> +    int ret = -1;
> 
>      if (virNodeGetInfo(conn, &nodeinfo) != 0) {
>          return  -1;
> @@ -1216,18 +1218,18 @@ qemuProcessSetVcpuAffinites(virConnectPtr conn,
>      if (maxcpu > hostcpus)
>          maxcpu = hostcpus;
> 
> +    if (VIR_ALLOC_N(cpumap, cpumaplen) < 0) {
> +        virReportOOMError();
> +        return -1;
> +    }
> +
>      for (vcpu = 0; vcpu < def->cputune.nvcpupin; vcpu++) {
>          if (vcpu != def->cputune.vcpupin[vcpu]->vcpuid)
>              continue;
> 
>          int i;
> -        unsigned char *cpumap = NULL;
> -
> -        if (VIR_ALLOC_N(cpumap, cpumaplen) < 0) {
> -            virReportOOMError();
> -            return -1;
> -        }
> 
> +        memset(cpumap, 0, cpumaplen);
>          cpumask = (unsigned char *)def->cputune.vcpupin[vcpu]->cpumask;
>          vcpupid = priv->vcpupids[vcpu];
> 
> @@ -1249,11 +1251,14 @@ qemuProcessSetVcpuAffinites(virConnectPtr conn,
>                                        cpumap,
>                                        cpumaplen,
>                                        maxcpu) < 0) {
> -            return -1;
> +            goto cleanup;
>          }
>      }
> 
> -    return 0;
> +    ret = 0;
> +cleanup:
> +    VIR_FREE(cpumap);
> +    return ret;
>  }

  Whoops !!! ACK, better to allocate out of the loop, fix looks fine,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list