virNetClientMarkClose() may cache the current error in client->error via
virSaveLastError() when a client is marked for close.

That error is normally released in virNetClientCloseLocked(), but some
teardown paths can dispose the client object without reaching that
cleanup.
In that case, client->error remains allocated and ASan reports a leak.

Free client->error in virNetClientDispose() as a final cleanup fallback.

This was observed during virtchd shutdown in test_disk_is_locked, with
the leak originating from:
virDomainInterfaceDeleteDevice() -> remoteConnectClose() ->
virNetClientMarkClose() -> virSaveLastError()

On-behalf-of: SAP [email protected]
Signed-off-by: Leander Kohler <[email protected]>
---
 src/rpc/virnetclient.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
index ee729d5e62..4838227f8d 100644
--- a/src/rpc/virnetclient.c
+++ b/src/rpc/virnetclient.c
@@ -757,6 +757,8 @@ void virNetClientDispose(void *obj)
     virObjectUnref(client->sasl);
 #endif
 
+    g_clear_pointer(&client->error, virFreeError);
+
     virNetMessageClear(&client->msg);
 }
 
-- 
2.51.2

Reply via email to