Hi all,
this is my first contribution to libvirt upstream. I am with Cyberus
Technology, where I work on cloud-hypervisor and its integration with
OpenStack and libvirt.
The following fixes a leak in virNetClient teardown.
virNetClientMarkClose() may save the current error in client->error
(via virSaveLastError()). We usually free that in
virNetClientCloseLocked(), but we can also end up disposing the client
without going through that cleanup.
One path where this happens is:
virConnectDispose()
-> remoteConnectClose()
-> doRemoteClose()
-> virNetClientClose(priv->client)
-> g_clear_pointer(&priv->client, virObjectUnref)
In that case, client->error can stay allocated until finalization, and
ASan reports a leak.
Fix is to also clear client->error in virNetClientDispose() as a final
fallback.
I included an ASan trace below.
Thanks,
Leander
---
Line numbers in this trace come from our downstream libvirt fork and may differ
from upstream, but the call path/function names are the same.
[ 276.247727] virtchd[4030]: ==4030==ERROR: LeakSanitizer: detected memory
leaks
Direct leak of 80 byte(s) in 1 object(s) allocated from:
#0 0x7fcd6009e110 in calloc (libasan.so.8+0xfc110)
#1 0x7fcd5dcb95bd in g_malloc0 (libglib-2.0.so.0+0x6d5bd)
#2 0x7fcd5eb15f31 in virSaveLastError ../src/util/virerror.c:413
#3 0x7fcd5ee6c76c in virNetClientMarkClose ../src/rpc/virnetclient.c:776
#4 0x7fcd5ee6f782 in virNetClientCloseInternal ../src/rpc/virnetclient.c:837
#5 0x7fcd5f0150e4 in doRemoteClose ../src/remote/remote_driver.c:1414
#6 0x7fcd5f0150e4 in remoteConnectClose ../src/remote/remote_driver.c:1442
#7 0x7fcd5f1a90ef in virConnectDispose ../src/datatypes.c:174
#8 0x7fcd5ea58ebb in vir_object_finalize ../src/util/virobject.c:323
#9 0x7fcd5dc05c52 in g_object_unref (libgobject-2.0.so.0+0x1ec52)
#10 0x7fcd5ea59fc7 in virObjectUnref ../src/util/virobject.c:377
#11 0x7fcd5ea59fc7 in virObjectUnref ../src/util/virobject.c:370
#12 0x7fcd5ef3a92f in glib_autoptr_clear_virConnect ../src/datatypes.h:548
#13 0x7fcd5ef3a92f in glib_autoptr_cleanup_virConnect ../src/datatypes.h:548
#14 0x7fcd5ef3a92f in virDomainInterfaceDeleteDevice
../src/hypervisor/domain_interface.c:419
#15 0x7fcd594a0cd3 in virCHProcessStopOrKill ../src/ch/ch_process.c:1308
#16 0x7fcd594a8bfa in virCHProcessStop ../src/ch/ch_process.c:1363
#17 0x7fcd5945d8c7 in chDomainDestroyFlags ../src/ch/ch_driver.c:959
#18 0x7fcd5f0f69c0 in virDomainDestroy ../src/libvirt-domain.c:514
#19 0x55c25777376a in remoteDispatchDomainDestroy
src/remote/remote_daemon_dispatch_stubs.h:5485
#20 0x55c25777376a in remoteDispatchDomainDestroyHelper
src/remote/remote_daemon_dispatch_stubs.h:5464
#21 0x7fcd5ee7c42c in virNetServerProgramDispatchCall
../src/rpc/virnetserverprogram.c:423
#22 0x7fcd5ee7c42c in virNetServerProgramDispatch
../src/rpc/virnetserverprogram.c:299
#23 0x7fcd5ee97c6c in virNetServerProcessMsg ../src/rpc/virnetserver.c:135
#24 0x7fcd5ee98b43 in virNetServerHandleJob ../src/rpc/virnetserver.c:155
#25 0x7fcd5eadbce2 in virThreadPoolWorker ../src/util/virthreadpool.c:164
#26 0x7fcd5eada3c9 in virThreadHelper ../src/util/virthread.c:256
#27 0x7fcd60004cd5 in asan_thread_start(void*) (libasan.so.8+0x62cd5)
#28 0x7fcd5d200979 in start_thread (libc.so.6+0x9a979)
#29 0x7fcd5d288d2b in __GI___clone3 (libc.so.6+0x122d2b)
Objects leaked above:
0x507000064400 (80 bytes)
SUMMARY: AddressSanitizer: 80 byte(s) leaked in 1 allocation(s).
Leander Kohler (1):
rpc: free saved close error in virNetClientDispose
src/rpc/virnetclient.c | 2 ++
1 file changed, 2 insertions(+)
--
2.51.2