On 01/05/2012 09:13 AM, Hu Tao wrote:
On Tue, Jan 03, 2012 at 11:14:15AM +0800, Hu Tao wrote:
> This is not a memory leak. See line 8029 and 8030 of qemu_driver.c.
>
> To ensure this, I tested twice following these steps:
>
> 1. set bandwidth lively (--live)
> 2. query bandwidth (--live)
> 3. set bandwidth lively (--live)
>
> The first time libvirtd crashed at step 2. The second time
> on step 2 I got strage data, and libvirtd crashed at step 3.
Yeah, I can
reproduce this and libvirtd crashed at step 3 for me.
In addition, valgrind can't find this memory leak, it's a negative
branch, coverity complains it, line 7994 called allocation function
"virAlloc" on "newBandwidth", and line 7999 variable
"newBandwidth"
is not freed or pointed-to in function "memset", lines 8007 and 8017
variable "newBandwidth" going out of scope leaks the storage it points to,
because 'cleanup' label hasn't freed allocated 'newBandwidth' variable
memory.
7994 if (VIR_ALLOC(newBandwidth) < 0) {
......
7999 memset(newBandwidth, 0, sizeof(newBandwidth));
......
8005 if (VIR_ALLOC(newBandwidth->in) < 0) {
8006 virReportOOMError();
8007 goto cleanup;
......
8015 if (VIR_ALLOC(newBandwidth->out) < 0) {
8016 virReportOOMError();
8017 goto cleanup;
......
Regards,
Alex
> ---
> src/qemu/qemu_driver.c | 5 +++--
> 1 files changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index e93fe87..4be36f5 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -7864,7 +7864,7 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
> virDomainDefPtr persistentDef = NULL;
> int ret = -1;
> virDomainNetDefPtr net = NULL, persistentNet = NULL;
> - virNetDevBandwidthPtr bandwidth = NULL, newBandwidth = NULL;
> + virNetDevBandwidthPtr bandwidth = NULL;
>
> virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
> VIR_DOMAIN_AFFECT_CONFIG, -1);
> @@ -7986,6 +7986,8 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
> }
>
> if (flags& VIR_DOMAIN_AFFECT_LIVE) {
> + virNetDevBandwidthPtr newBandwidth = NULL;
> +
> if (VIR_ALLOC(newBandwidth)< 0) {
> virReportOOMError();
> goto cleanup;
> @@ -8053,7 +8055,6 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
> ret = 0;
> cleanup:
> virNetDevBandwidthFree(bandwidth);
> - virNetDevBandwidthFree(newBandwidth);
> virCgroupFree(&group);
> if (vm)
> virDomainObjUnlock(vm);
> --
> 1.7.4.4
>
> --
> libvir-list mailing list
> libvir-list(a)redhat.com
>
https://www.redhat.com/mailman/listinfo/libvir-list
ping.