[libvirt] Memory leak due to virCopyError()

Stefan Berger stefanb at linux.vnet.ibm.com
Fri Apr 27 15:30:42 UTC 2012


If someone has the time ... I am seeing a memory leak in this code path. 
The leak seems to be triggerable by shutting down a VM:

==4717== 40 bytes in 1 blocks are definitely lost in loss record 547 of 
1,014
==4717==    at 0x4A05E46: malloc (vg_replace_malloc.c:195)
==4717==    by 0x38EC27FC01: strdup (strdup.c:43)
==4717==    by 0x4EA55E0: virCopyError (virterror.c:255)
==4717==    by 0x4EA58B1: virCopyLastError (virterror.c:356)
==4717==    by 0x4CB4B6: qemuMonitorIO (qemu_monitor.c:646)
==4717==    by 0x4E80C7F: virEventPollDispatchHandles (event_poll.c:490)
==4717==    by 0x4E8150B: virEventPollRunOnce (event_poll.c:637)
==4717==    by 0x4E7F5B7: virEventRunDefaultImpl (event.c:247)
==4717==    by 0x4FA4F50: virNetServerRun (virnetserver.c:713)
==4717==    by 0x4221AF: main (libvirtd.c:1133)

My guess is the leak is related to the initialization of the error 
structure as for example here:

int
virConnCopyLastError(virConnectPtr conn, virErrorPtr to)
{
     /* We can't guarantee caller has initialized it to zero */
     memset(to, 0, sizeof(*to));

     if (conn == NULL)
         return -1;
     virMutexLock(&conn->lock);
     if (conn->err.code == VIR_ERR_OK)
         virResetError(to);
     else


After memset'ting 'to' to all zeros, the call to virResetError() seems 
pointless... Such memsets are also in other places potentially 
overwriting previously allocated pointers...

    Stefan




More information about the libvir-list mailing list