From bed26ed508048119463dd970c90602d6507de08f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Fri, 22 Jan 2021 14:51:17 +0000 Subject: [PATCH] qemu: fix release of virDomainObjPtr in SSH key APIs MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The qemuDomainObjFromDomain() API must be paired with the virDomainObjEndAPI API. The qemuDomainAuthorizedSSHKeysGet method simply did 'return -1' leaking a reference and lock in two paths. The qemuDomainAuthorizedSSHKeysSet method marked the object as an autoptr while also have some code paths that will call virDomainObjEndAPI. As a result the object will be released but not unlocked in error paths. Reviewed-by: Daniel Henrique Barboza Reviewed-by: Michal Privoznik Signed-off-by: Daniel P. Berrangé --- src/qemu/qemu_driver.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 85f230e5d5..6193376544 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -20256,10 +20256,10 @@ qemuDomainAuthorizedSSHKeysGet(virDomainPtr dom, return -1; if (virDomainAuthorizedSshKeysGetEnsureACL(dom->conn, vm->def) < 0) - return -1; + goto cleanup; if (qemuDomainObjBeginAgentJob(driver, vm, QEMU_AGENT_JOB_QUERY) < 0) - return -1; + goto cleanup; if (!qemuDomainAgentAvailable(vm, true)) goto endagentjob; @@ -20270,6 +20270,7 @@ qemuDomainAuthorizedSSHKeysGet(virDomainPtr dom, endagentjob: qemuDomainObjEndAgentJob(vm); + cleanup: virDomainObjEndAPI(&vm); return rv; } @@ -20283,7 +20284,7 @@ qemuDomainAuthorizedSSHKeysSet(virDomainPtr dom, unsigned int flags) { virQEMUDriverPtr driver = dom->conn->privateData; - g_autoptr(virDomainObj) vm = NULL; + virDomainObjPtr vm = NULL; qemuAgentPtr agent; const bool append = flags & VIR_DOMAIN_AUTHORIZED_SSH_KEYS_SET_APPEND; const bool remove = flags & VIR_DOMAIN_AUTHORIZED_SSH_KEYS_SET_REMOVE; @@ -20296,10 +20297,10 @@ qemuDomainAuthorizedSSHKeysSet(virDomainPtr dom, return -1; if (virDomainAuthorizedSshKeysSetEnsureACL(dom->conn, vm->def) < 0) - return -1; + goto cleanup; if (qemuDomainObjBeginAgentJob(driver, vm, QEMU_AGENT_JOB_QUERY) < 0) - return -1; + goto cleanup; if (!qemuDomainAgentAvailable(vm, true)) goto endagentjob; @@ -20313,6 +20314,7 @@ qemuDomainAuthorizedSSHKeysSet(virDomainPtr dom, endagentjob: qemuDomainObjEndAgentJob(vm); + cleanup: virDomainObjEndAPI(&vm); return rv; } -- 2.47.2