1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-03-07 17:28:15 +00:00

qemu: agent: fix unsafe agent access

qemuDomainObjExitAgent is unsafe.

First it accesses domain object without domain lock.
Second it uses outdated logic that goes back to commit 79533da1 of
year 2009 when code was quite different. (unref function
instead of unreferencing only unlocked and disposed object
in case of last reference and leaved unlocking to the caller otherwise).
Nowadays this logic may lead to disposing locked object
i guess.

Another problem is that the callers of qemuDomainObjEnterAgent
use domain object again (namely priv->agent) without domain lock.

This patch address these two problems.

qemuDomainGetAgent is dropped as unused.
This commit is contained in:
Nikolay Shirokovskiy 2016-11-14 17:24:23 +03:00 committed by Maxim Nestratov
parent 3c1c56781d
commit aaf2992d90
3 changed files with 91 additions and 110 deletions

View File

@ -3615,19 +3615,6 @@ qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
} }
/**
* qemuDomainGetAgent:
* @vm: domain object
*
* Returns the agent pointer of @vm;
*/
qemuAgentPtr
qemuDomainGetAgent(virDomainObjPtr vm)
{
return (((qemuDomainObjPrivatePtr)(vm->privateData))->agent);
}
/* /*
* obj must be locked before calling * obj must be locked before calling
* *
@ -3637,16 +3624,20 @@ qemuDomainGetAgent(virDomainObjPtr vm)
* *
* To be followed with qemuDomainObjExitAgent() once complete * To be followed with qemuDomainObjExitAgent() once complete
*/ */
void qemuAgentPtr
qemuDomainObjEnterAgent(virDomainObjPtr obj) qemuDomainObjEnterAgent(virDomainObjPtr obj)
{ {
qemuDomainObjPrivatePtr priv = obj->privateData; qemuDomainObjPrivatePtr priv = obj->privateData;
qemuAgentPtr agent = priv->agent;
VIR_DEBUG("Entering agent (agent=%p vm=%p name=%s)", VIR_DEBUG("Entering agent (agent=%p vm=%p name=%s)",
priv->agent, obj, obj->def->name); priv->agent, obj, obj->def->name);
virObjectLock(priv->agent);
virObjectRef(priv->agent); virObjectLock(agent);
virObjectRef(agent);
virObjectUnlock(obj); virObjectUnlock(obj);
return agent;
} }
@ -3655,22 +3646,14 @@ qemuDomainObjEnterAgent(virDomainObjPtr obj)
* Should be paired with an earlier qemuDomainObjEnterAgent() call * Should be paired with an earlier qemuDomainObjEnterAgent() call
*/ */
void void
qemuDomainObjExitAgent(virDomainObjPtr obj) qemuDomainObjExitAgent(virDomainObjPtr obj, qemuAgentPtr agent)
{ {
qemuDomainObjPrivatePtr priv = obj->privateData; virObjectUnlock(agent);
bool hasRefs; virObjectUnref(agent);
hasRefs = virObjectUnref(priv->agent);
if (hasRefs)
virObjectUnlock(priv->agent);
virObjectLock(obj); virObjectLock(obj);
VIR_DEBUG("Exited agent (agent=%p vm=%p name=%s)",
priv->agent, obj, obj->def->name);
if (!hasRefs) VIR_DEBUG("Exited agent (agent=%p vm=%p name=%s)",
priv->agent = NULL; agent, obj, obj->def->name);
} }
void qemuDomainObjEnterRemote(virDomainObjPtr obj) void qemuDomainObjEnterRemote(virDomainObjPtr obj)

View File

@ -449,11 +449,10 @@ int qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
qemuAgentPtr qemuDomainGetAgent(virDomainObjPtr vm); qemuAgentPtr qemuDomainObjEnterAgent(virDomainObjPtr obj)
void qemuDomainObjEnterAgent(virDomainObjPtr obj)
ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitAgent(virDomainObjPtr obj)
ATTRIBUTE_NONNULL(1); ATTRIBUTE_NONNULL(1);
void qemuDomainObjExitAgent(virDomainObjPtr obj, qemuAgentPtr agent)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
void qemuDomainObjEnterRemote(virDomainObjPtr obj) void qemuDomainObjEnterRemote(virDomainObjPtr obj)

View File

@ -2013,10 +2013,11 @@ static int qemuDomainShutdownFlags(virDomainPtr dom, unsigned int flags)
if (useAgent) { if (useAgent) {
qemuAgentPtr agent;
qemuDomainSetFakeReboot(driver, vm, false); qemuDomainSetFakeReboot(driver, vm, false);
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ret = qemuAgentShutdown(priv->agent, agentFlag); ret = qemuAgentShutdown(agent, agentFlag);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
} }
/* If we are not enforced to use just an agent, try ACPI /* If we are not enforced to use just an agent, try ACPI
@ -2106,10 +2107,12 @@ qemuDomainReboot(virDomainPtr dom, unsigned int flags)
} }
if (useAgent) { if (useAgent) {
qemuAgentPtr agent;
qemuDomainSetFakeReboot(driver, vm, false); qemuDomainSetFakeReboot(driver, vm, false);
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ret = qemuAgentShutdown(priv->agent, agentFlag); ret = qemuAgentShutdown(agent, agentFlag);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
} }
/* If we are not enforced to use just an agent, try ACPI /* If we are not enforced to use just an agent, try ACPI
@ -4679,6 +4682,7 @@ qemuDomainSetVcpusAgent(virDomainObjPtr vm,
unsigned int nvcpus) unsigned int nvcpus)
{ {
qemuAgentCPUInfoPtr cpuinfo = NULL; qemuAgentCPUInfoPtr cpuinfo = NULL;
qemuAgentPtr agent;
int ncpuinfo; int ncpuinfo;
int ret = -1; int ret = -1;
@ -4693,9 +4697,10 @@ qemuDomainSetVcpusAgent(virDomainObjPtr vm,
goto cleanup; goto cleanup;
} }
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ncpuinfo = qemuAgentGetVCPUs(qemuDomainGetAgent(vm), &cpuinfo); ncpuinfo = qemuAgentGetVCPUs(agent, &cpuinfo);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
agent = NULL;
if (ncpuinfo < 0) if (ncpuinfo < 0)
goto cleanup; goto cleanup;
@ -4706,9 +4711,9 @@ qemuDomainSetVcpusAgent(virDomainObjPtr vm,
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto cleanup; goto cleanup;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ret = qemuAgentSetVCPUs(qemuDomainGetAgent(vm), cpuinfo, ncpuinfo); ret = qemuAgentSetVCPUs(agent, cpuinfo, ncpuinfo);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
cleanup: cleanup:
VIR_FREE(cpuinfo); VIR_FREE(cpuinfo);
@ -5481,11 +5486,11 @@ static int
qemuDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags) qemuDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
{ {
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
qemuDomainObjPrivatePtr priv;
virDomainObjPtr vm; virDomainObjPtr vm;
virDomainDefPtr def; virDomainDefPtr def;
int ret = -1; int ret = -1;
qemuAgentCPUInfoPtr cpuinfo = NULL; qemuAgentCPUInfoPtr cpuinfo = NULL;
qemuAgentPtr agent;
int ncpuinfo = -1; int ncpuinfo = -1;
size_t i; size_t i;
@ -5497,8 +5502,6 @@ qemuDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
if (!(vm = qemuDomObjFromDomain(dom))) if (!(vm = qemuDomObjFromDomain(dom)))
return -1; return -1;
priv = vm->privateData;
if (virDomainGetVcpusFlagsEnsureACL(dom->conn, vm->def, flags) < 0) if (virDomainGetVcpusFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
goto cleanup; goto cleanup;
@ -5519,9 +5522,9 @@ qemuDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto endjob; goto endjob;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ncpuinfo = qemuAgentGetVCPUs(priv->agent, &cpuinfo); ncpuinfo = qemuAgentGetVCPUs(agent, &cpuinfo);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
endjob: endjob:
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
@ -13458,15 +13461,15 @@ qemuDomainSnapshotFSFreeze(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
const char **mountpoints, const char **mountpoints,
unsigned int nmountpoints) unsigned int nmountpoints)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuAgentPtr agent;
int frozen; int frozen;
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
return -1; return -1;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
frozen = qemuAgentFSFreeze(priv->agent, mountpoints, nmountpoints); frozen = qemuAgentFSFreeze(agent, mountpoints, nmountpoints);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
return frozen < 0 ? -2 : frozen; return frozen < 0 ? -2 : frozen;
} }
@ -13477,20 +13480,20 @@ qemuDomainSnapshotFSThaw(virQEMUDriverPtr driver ATTRIBUTE_UNUSED,
virDomainObjPtr vm, virDomainObjPtr vm,
bool report) bool report)
{ {
qemuDomainObjPrivatePtr priv = vm->privateData; qemuAgentPtr agent;
int thawed; int thawed;
virErrorPtr err = NULL; virErrorPtr err = NULL;
if (!qemuDomainAgentAvailable(vm, report)) if (!qemuDomainAgentAvailable(vm, report))
return -1; return -1;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
if (!report) if (!report)
err = virSaveLastError(); err = virSaveLastError();
thawed = qemuAgentFSThaw(priv->agent); thawed = qemuAgentFSThaw(agent);
if (!report) if (!report)
virSetError(err); virSetError(err);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
virFreeError(err); virFreeError(err);
@ -18041,6 +18044,7 @@ qemuDomainPMSuspendForDuration(virDomainPtr dom,
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
qemuDomainObjPrivatePtr priv; qemuDomainObjPrivatePtr priv;
virDomainObjPtr vm; virDomainObjPtr vm;
qemuAgentPtr agent;
int ret = -1; int ret = -1;
virCheckFlags(0, -1); virCheckFlags(0, -1);
@ -18106,9 +18110,9 @@ qemuDomainPMSuspendForDuration(virDomainPtr dom,
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto endjob; goto endjob;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ret = qemuAgentSuspend(priv->agent, target); ret = qemuAgentSuspend(agent, target);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
endjob: endjob:
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
@ -18196,15 +18200,13 @@ qemuDomainQemuAgentCommand(virDomainPtr domain,
virDomainObjPtr vm; virDomainObjPtr vm;
int ret = -1; int ret = -1;
char *result = NULL; char *result = NULL;
qemuDomainObjPrivatePtr priv; qemuAgentPtr agent;
virCheckFlags(0, NULL); virCheckFlags(0, NULL);
if (!(vm = qemuDomObjFromDomain(domain))) if (!(vm = qemuDomObjFromDomain(domain)))
goto cleanup; goto cleanup;
priv = vm->privateData;
if (virDomainQemuAgentCommandEnsureACL(domain->conn, vm->def) < 0) if (virDomainQemuAgentCommandEnsureACL(domain->conn, vm->def) < 0)
goto cleanup; goto cleanup;
@ -18220,9 +18222,9 @@ qemuDomainQemuAgentCommand(virDomainPtr domain,
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto endjob; goto endjob;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ret = qemuAgentArbitraryCommand(priv->agent, cmd, &result, timeout); ret = qemuAgentArbitraryCommand(agent, cmd, &result, timeout);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
if (ret < 0) if (ret < 0)
VIR_FREE(result); VIR_FREE(result);
@ -18291,8 +18293,8 @@ qemuDomainFSTrim(virDomainPtr dom,
{ {
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
virDomainObjPtr vm; virDomainObjPtr vm;
qemuAgentPtr agent;
int ret = -1; int ret = -1;
qemuDomainObjPrivatePtr priv;
virCheckFlags(0, -1); virCheckFlags(0, -1);
@ -18306,8 +18308,6 @@ qemuDomainFSTrim(virDomainPtr dom,
if (!(vm = qemuDomObjFromDomain(dom))) if (!(vm = qemuDomObjFromDomain(dom)))
goto cleanup; goto cleanup;
priv = vm->privateData;
if (virDomainFSTrimEnsureACL(dom->conn, vm->def) < 0) if (virDomainFSTrimEnsureACL(dom->conn, vm->def) < 0)
goto cleanup; goto cleanup;
@ -18323,9 +18323,9 @@ qemuDomainFSTrim(virDomainPtr dom,
goto endjob; goto endjob;
} }
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ret = qemuAgentFSTrim(priv->agent, minimum); ret = qemuAgentFSTrim(agent, minimum);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
endjob: endjob:
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
@ -18484,7 +18484,7 @@ qemuDomainGetTime(virDomainPtr dom,
{ {
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
virDomainObjPtr vm = NULL; virDomainObjPtr vm = NULL;
qemuDomainObjPrivatePtr priv; qemuAgentPtr agent;
int ret = -1; int ret = -1;
int rv; int rv;
@ -18496,8 +18496,6 @@ qemuDomainGetTime(virDomainPtr dom,
if (virDomainGetTimeEnsureACL(dom->conn, vm->def) < 0) if (virDomainGetTimeEnsureACL(dom->conn, vm->def) < 0)
goto cleanup; goto cleanup;
priv = vm->privateData;
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0) if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
goto cleanup; goto cleanup;
@ -18510,9 +18508,9 @@ qemuDomainGetTime(virDomainPtr dom,
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto endjob; goto endjob;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
rv = qemuAgentGetTime(priv->agent, seconds, nseconds); rv = qemuAgentGetTime(agent, seconds, nseconds);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
if (rv < 0) if (rv < 0)
goto endjob; goto endjob;
@ -18536,6 +18534,7 @@ qemuDomainSetTime(virDomainPtr dom,
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
qemuDomainObjPrivatePtr priv; qemuDomainObjPrivatePtr priv;
virDomainObjPtr vm; virDomainObjPtr vm;
qemuAgentPtr agent;
bool rtcSync = flags & VIR_DOMAIN_TIME_SYNC; bool rtcSync = flags & VIR_DOMAIN_TIME_SYNC;
int ret = -1; int ret = -1;
int rv; int rv;
@ -18574,9 +18573,9 @@ qemuDomainSetTime(virDomainPtr dom,
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto endjob; goto endjob;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
rv = qemuAgentSetTime(priv->agent, seconds, nseconds, rtcSync); rv = qemuAgentSetTime(agent, seconds, nseconds, rtcSync);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
if (rv < 0) if (rv < 0)
goto endjob; goto endjob;
@ -19679,8 +19678,8 @@ qemuDomainGetFSInfo(virDomainPtr dom,
unsigned int flags) unsigned int flags)
{ {
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
qemuDomainObjPrivatePtr priv;
virDomainObjPtr vm; virDomainObjPtr vm;
qemuAgentPtr agent;
int ret = -1; int ret = -1;
virCheckFlags(0, ret); virCheckFlags(0, ret);
@ -19691,8 +19690,6 @@ qemuDomainGetFSInfo(virDomainPtr dom,
if (virDomainGetFSInfoEnsureACL(dom->conn, vm->def) < 0) if (virDomainGetFSInfoEnsureACL(dom->conn, vm->def) < 0)
goto cleanup; goto cleanup;
priv = vm->privateData;
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0) if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
goto cleanup; goto cleanup;
@ -19705,9 +19702,9 @@ qemuDomainGetFSInfo(virDomainPtr dom,
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto endjob; goto endjob;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ret = qemuAgentGetFSInfo(priv->agent, info, vm->def); ret = qemuAgentGetFSInfo(agent, info, vm->def);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
endjob: endjob:
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
@ -19724,8 +19721,8 @@ qemuDomainInterfaceAddresses(virDomainPtr dom,
unsigned int flags) unsigned int flags)
{ {
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
qemuDomainObjPrivatePtr priv = NULL;
virDomainObjPtr vm = NULL; virDomainObjPtr vm = NULL;
qemuAgentPtr agent;
int ret = -1; int ret = -1;
virCheckFlags(0, -1); virCheckFlags(0, -1);
@ -19733,8 +19730,6 @@ qemuDomainInterfaceAddresses(virDomainPtr dom,
if (!(vm = qemuDomObjFromDomain(dom))) if (!(vm = qemuDomObjFromDomain(dom)))
goto cleanup; goto cleanup;
priv = vm->privateData;
if (virDomainInterfaceAddressesEnsureACL(dom->conn, vm->def) < 0) if (virDomainInterfaceAddressesEnsureACL(dom->conn, vm->def) < 0)
goto cleanup; goto cleanup;
@ -19756,9 +19751,9 @@ qemuDomainInterfaceAddresses(virDomainPtr dom,
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto endjob; goto endjob;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ret = qemuAgentGetInterfaces(priv->agent, ifaces); ret = qemuAgentGetInterfaces(agent, ifaces);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
endjob: endjob:
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);
@ -19882,8 +19877,8 @@ qemuDomainSetUserPassword(virDomainPtr dom,
unsigned int flags) unsigned int flags)
{ {
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
qemuDomainObjPrivatePtr priv;
virDomainObjPtr vm; virDomainObjPtr vm;
qemuAgentPtr agent;
int ret = -1; int ret = -1;
int rv; int rv;
@ -19895,8 +19890,6 @@ qemuDomainSetUserPassword(virDomainPtr dom,
if (virDomainSetUserPasswordEnsureACL(dom->conn, vm->def) < 0) if (virDomainSetUserPasswordEnsureACL(dom->conn, vm->def) < 0)
goto cleanup; goto cleanup;
priv = vm->privateData;
if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0)
goto cleanup; goto cleanup;
@ -19909,10 +19902,10 @@ qemuDomainSetUserPassword(virDomainPtr dom,
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto endjob; goto endjob;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
rv = qemuAgentSetUserPassword(priv->agent, user, password, rv = qemuAgentSetUserPassword(agent, user, password,
flags & VIR_DOMAIN_PASSWORD_ENCRYPTED); flags & VIR_DOMAIN_PASSWORD_ENCRYPTED);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
if (rv < 0) if (rv < 0)
goto endjob; goto endjob;
@ -20142,6 +20135,7 @@ qemuDomainGetGuestVcpus(virDomainPtr dom,
{ {
virQEMUDriverPtr driver = dom->conn->privateData; virQEMUDriverPtr driver = dom->conn->privateData;
virDomainObjPtr vm = NULL; virDomainObjPtr vm = NULL;
qemuAgentPtr agent;
qemuAgentCPUInfoPtr info = NULL; qemuAgentCPUInfoPtr info = NULL;
int ninfo = 0; int ninfo = 0;
int ret = -1; int ret = -1;
@ -20160,9 +20154,9 @@ qemuDomainGetGuestVcpus(virDomainPtr dom,
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto endjob; goto endjob;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ninfo = qemuAgentGetVCPUs(qemuDomainGetAgent(vm), &info); ninfo = qemuAgentGetVCPUs(agent, &info);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
if (ninfo < 0) if (ninfo < 0)
goto endjob; goto endjob;
@ -20192,6 +20186,7 @@ qemuDomainSetGuestVcpus(virDomainPtr dom,
virDomainObjPtr vm = NULL; virDomainObjPtr vm = NULL;
virBitmapPtr map = NULL; virBitmapPtr map = NULL;
qemuAgentCPUInfoPtr info = NULL; qemuAgentCPUInfoPtr info = NULL;
qemuAgentPtr agent;
int ninfo = 0; int ninfo = 0;
size_t i; size_t i;
int ret = -1; int ret = -1;
@ -20218,9 +20213,10 @@ qemuDomainSetGuestVcpus(virDomainPtr dom,
if (!qemuDomainAgentAvailable(vm, true)) if (!qemuDomainAgentAvailable(vm, true))
goto endjob; goto endjob;
qemuDomainObjEnterAgent(vm); agent = qemuDomainObjEnterAgent(vm);
ninfo = qemuAgentGetVCPUs(qemuDomainGetAgent(vm), &info); ninfo = qemuAgentGetVCPUs(agent, &info);
qemuDomainObjExitAgent(vm); qemuDomainObjExitAgent(vm, agent);
agent = NULL;
if (ninfo < 0) if (ninfo < 0)
goto endjob; goto endjob;
@ -20249,9 +20245,12 @@ qemuDomainSetGuestVcpus(virDomainPtr dom,
goto endjob; goto endjob;
} }
qemuDomainObjEnterAgent(vm); if (!qemuDomainAgentAvailable(vm, true))
ret = qemuAgentSetVCPUs(qemuDomainGetAgent(vm), info, ninfo); goto endjob;
qemuDomainObjExitAgent(vm);
agent = qemuDomainObjEnterAgent(vm);
ret = qemuAgentSetVCPUs(agent, info, ninfo);
qemuDomainObjExitAgent(vm, agent);
endjob: endjob:
qemuDomainObjEndJob(driver, vm); qemuDomainObjEndJob(driver, vm);