[libvirt] [PATCH] qemuMonitorTextGetMemoryStats: plug a leak on an error path

Daniel P. Berrange berrange at redhat.com
Mon Jan 25 16:03:02 UTC 2010


On Wed, Jan 20, 2010 at 06:48:31PM +0100, Jim Meyering wrote:
> Coverity complained about a leak via this return -1
> in qemu_monitor_text.c:
> 
>   int qemuMonitorTextGetMemoryStats(qemuMonitorPtr mon,
>                                     virDomainMemoryStatPtr stats,
>                                     unsigned int nr_stats)
>   {
>       char *reply = NULL;
>       int ret = 0;
>       char *offset;
> 
>       if (qemuMonitorCommand(mon, "info balloon", &reply) < 0) {
>           qemudReportError(NULL, NULL, NULL, VIR_ERR_OPERATION_FAILED,
>                            "%s", _("could not query memory balloon statistics"));
>           return -1;
>       }
> 
> That can happen because
> qemuMonitorCommand calls
> qemuMonitorCommandWithFd which calls
> qemuMonitorCommandWithHandler, which does this:
> 
> 
> 218    ret = qemuMonitorSend(mon, &msg);
> ...
> 228  	    if (msg.rxBuffer) {
> 229  	        *reply = msg.rxBuffer;
> 230  	    } else {
> 231  	        *reply = strdup("");
> 232  	        if (!*reply) {
> 233  	            virReportOOMError(NULL);
> 234  	            return -1;
> 235  	        }
> 236  	    }
> 237
> 238  	    if (ret < 0)
> 239  	        virReportSystemError(NULL, msg.lastErrno,
> 240  	                             _("cannot send monitor command '%s'"), cmd);
> 241
> 242  	    return ret;
> 243  	}
> 
> That function breaks contract by failing to free *reply when it
> returns a negative value.  Here's the fix:
> 
> >From 3b44df075f9d4330ec27d59eddaa0a32c20d7ac1 Mon Sep 17 00:00:00 2001
> From: Jim Meyering <meyering at redhat.com>
> Date: Wed, 20 Jan 2010 18:24:47 +0100
> Subject: [PATCH] qemuMonitorTextGetMemoryStats: plug a leak on an error path
> 
> * src/qemu/qemu_monitor_text.c (qemuMonitorCommandWithHandler):
> Always free *reply, upon failure.
> ---
>  src/qemu/qemu_monitor_text.c |    6 ++++--
>  1 files changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
> index c3848b5..d921c7e 100644
> --- a/src/qemu/qemu_monitor_text.c
> +++ b/src/qemu/qemu_monitor_text.c
> @@ -1,7 +1,7 @@
>  /*
>   * qemu_monitor_text.c: interaction with QEMU monitor console
>   *
> - * Copyright (C) 2006-2009 Red Hat, Inc.
> + * Copyright (C) 2006-2010 Red Hat, Inc.
>   * Copyright (C) 2006 Daniel P. Berrange
>   *
>   * This library is free software; you can redistribute it and/or
> @@ -235,9 +235,11 @@ qemuMonitorCommandWithHandler(qemuMonitorPtr mon,
>          }
>      }
> 
> -    if (ret < 0)
> +    if (ret < 0) {
>          virReportSystemError(NULL, msg.lastErrno,
>                               _("cannot send monitor command '%s'"), cmd);
> +        VIR_FREE(*reply);
> +    }
> 
>      return ret;
>  }

ACK, that is good - I definitely intended that  *reply was NULL upon
error return.

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list