[libvirt] [PATCH] conf: avoid memory leak on virDomainDefParseXML

Daniel Veillard veillard at redhat.com
Fri Sep 16 13:21:24 UTC 2011


On Fri, Sep 16, 2011 at 01:54:47PM +0800, ajia at redhat.com wrote:
> From: Alex Jia <ajia at redhat.com>
> 
> * conf/domain_conf.c: allocate memory to def->redirdevs in 
>   virDomainDefParseXML such as VIR_ALLOC_N(def->redirdevs, n),
>   however, virDomainDefFree(def) hasn't released these memory.
> 
> * Detected in valgrind run:
> 
> ==19820== 209 (16 direct, 193 indirect) bytes in 1 blocks are definitely lost in loss record 25 of 26
> ==19820==    at 0x4A04A28: calloc (vg_replace_malloc.c:467)
> ==19820==    by 0x4A13AF: virAllocN (memory.c:129)
> ==19820==    by 0x4D4A0E: virDomainDefParseXML (domain_conf.c:7258)
> ==19820==    by 0x4D4C93: virDomainDefParseNode (domain_conf.c:7512)
> ==19820==    by 0x4D562F: virDomainDefParse (domain_conf.c:7465)
> ==19820==    by 0x415863: testCompareXMLToXMLFiles (qemuxml2xmltest.c:35)
> ==19820==    by 0x415982: testCompareXMLToXMLHelper (qemuxml2xmltest.c:80)
> ==19820==    by 0x416D31: virtTestRun (testutils.c:140)
> ==19820==    by 0x415604: mymain (qemuxml2xmltest.c:192)
> ==19820==    by 0x416437: virtTestMain (testutils.c:689)
> ==19820==    by 0x3CA7A1ECDC: (below main) (in /lib64/libc-2.12.so)
> ==19820==
> ==19820== LEAK SUMMARY:
> ==19820==    definitely lost: 16 bytes in 1 blocks
> ==19820==    indirectly lost: 193 bytes in 5 blocks
> ==19820==      possibly lost: 0 bytes in 0 blocks
> ==19820==    still reachable: 1,054 bytes in 21 blocks
> 
> * How to reproduce?
> % valgrind -v --leak-check=full ./tests/qemuxml2xmltest
> 
> 
> Signed-off-by: Alex Jia <ajia at redhat.com>
> ---
>  src/conf/domain_conf.c |    4 ++++
>  1 files changed, 4 insertions(+), 0 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index ea6b581..03ab447 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -1206,6 +1206,10 @@ void virDomainDefFree(virDomainDefPtr def)
>          virDomainHubDefFree(def->hubs[i]);
>      VIR_FREE(def->hubs);
>  
> +    for (i = 0 ; i < def->nredirdevs ; i++)
> +        virDomainRedirdevDefFree(def->redirdevs[i]);
> +    VIR_FREE(def->redirdevs);
> +
>      VIR_FREE(def->os.type);
>      VIR_FREE(def->os.arch);
>      VIR_FREE(def->os.machine);

  ACK, reproduced, confirmed, and patch is teh right thing to do,

   thanks, applied !

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