[libvirt] [PATCH] virsh: avoid double free of domain

Wen Congyang wency at cn.fujitsu.com
Mon Jul 18 01:17:45 UTC 2011


At 07/17/2011 11:29 PM, ajia at redhat.com Write:
> From: Alex Jia <ajia at redhat.com>
> 
> * tools/virsh.c: avoid double free of domain, when weight value of blkiotune
>   less than 0, codes will free domain and jump to cleanup section, however,
>   cleanup will free domain again.
> 
> Detected in valgrind run:
> 
> ==21297== ERROR SUMMARY: 20 errors from 20 contexts (suppressed: 69 from 8)
> ==21297== 
> ==21297== 1 errors in context 1 of 20:
> ==21297== Invalid read of size 4
> ==21297==    at 0x40E209B: virDomainFree (libvirt.c:2096)
> ==21297==    by 0x8065274: cmdBlkiotune (virsh.c:3695)
> ==21297==    by 0x8054CC1: vshCommandRun (virsh.c:13135)
> ==21297==    by 0x806B967: main (virsh.c:14487)
> ==21297==  Address 0x446ad48 is 0 bytes inside a block of size 36 free'd
> ==21297==    at 0x4005B0A: free (vg_replace_malloc.c:325)
> ==21297==    by 0x406814D: virFree (memory.c:310)
> ==21297==    by 0x40D6635: virReleaseDomain (datatypes.c:243)
> ==21297==    by 0x40D6C5E: virUnrefDomain (datatypes.c:280)
> ==21297==    by 0x40E20B9: virDomainFree (libvirt.c:2101)
> ==21297==    by 0x8065297: cmdBlkiotune (virsh.c:3613)
> ==21297==    by 0x8054CC1: vshCommandRun (virsh.c:13135)
> ==21297==    by 0x806B967: main (virsh.c:14487)
> ==21297== 
> ==21297== 
> ==21297== 1 errors in context 2 of 20:
> ==21297== Invalid read of size 4
> ==21297==    at 0x40E1FE6: virDomainFree (libvirt.c:2092)
> ==21297==    by 0x8065274: cmdBlkiotune (virsh.c:3695)
> ==21297==    by 0x8054CC1: vshCommandRun (virsh.c:13135)
> ==21297==    by 0x806B967: main (virsh.c:14487)
> ==21297==  Address 0x446ad48 is 0 bytes inside a block of size 36 free'd
> ==21297==    at 0x4005B0A: free (vg_replace_malloc.c:325)
> ==21297==    by 0x406814D: virFree (memory.c:310)
> ==21297==    by 0x40D6635: virReleaseDomain (datatypes.c:243)
> ==21297==    by 0x40D6C5E: virUnrefDomain (datatypes.c:280)
> ==21297==    by 0x40E20B9: virDomainFree (libvirt.c:2101)
> ==21297==    by 0x8065297: cmdBlkiotune (virsh.c:3613)
> ==21297==    by 0x8054CC1: vshCommandRun (virsh.c:13135)
> ==21297==    by 0x806B967: main (virsh.c:14487)
> 
> * how to reproduce?
>   % valgrind -v --leak-check=full virsh blkiotune guestname --weight -1
> 
> ---
>  tools/virsh.c |    1 -
>  1 files changed, 0 insertions(+), 1 deletions(-)
> 
> diff --git a/tools/virsh.c b/tools/virsh.c
> index e75a249..cba249a 100644
> --- a/tools/virsh.c
> +++ b/tools/virsh.c
> @@ -3610,7 +3610,6 @@ cmdBlkiotune(vshControl * ctl, const vshCmd * cmd)
>      if (weight) {
>          nparams++;
>          if (weight < 0) {
> -            virDomainFree(dom);
>              vshError(ctl, _("Invalid value of %d for I/O weight"), weight);
>              goto cleanup;
>          }
ACK




More information about the libvir-list mailing list