From: Peter Krempa Date: Mon, 3 Jun 2013 13:58:31 +0000 (+0200) Subject: qemu: Properly report guest agent errors on command passthrough X-Git-Tag: v1.1.0-rc1~155 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6e5b36d5d2fbe3c207651ab653b552dcae6af888;p=thirdparty%2Flibvirt.git qemu: Properly report guest agent errors on command passthrough The code for arbitrary guest agent passthrough was horribly broken since introduction. Fix it to correctly report errors. --- diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index c7a9681502..00fe13f598 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -1408,25 +1408,32 @@ qemuAgentArbitraryCommand(qemuAgentPtr mon, int timeout) { int ret = -1; - virJSONValuePtr cmd; + virJSONValuePtr cmd = NULL; virJSONValuePtr reply = NULL; *result = NULL; - if (timeout < VIR_DOMAIN_QEMU_AGENT_COMMAND_MIN) - return ret; + if (timeout < VIR_DOMAIN_QEMU_AGENT_COMMAND_MIN) { + virReportError(VIR_ERR_INVALID_ARG, + _("guest agent timeout '%d' is " + "less than the minimum '%d'"), + timeout, VIR_DOMAIN_QEMU_AGENT_COMMAND_MIN); + goto cleanup; + } - cmd = virJSONValueFromString(cmd_str); - if (!cmd) - return ret; + if (!(cmd = virJSONValueFromString(cmd_str))) + goto cleanup; + + if ((ret = qemuAgentCommand(mon, cmd, &reply, timeout)) < 0) + goto cleanup; - ret = qemuAgentCommand(mon, cmd, &reply, timeout); + if ((ret = qemuAgentCheckError(cmd, reply)) < 0) + goto cleanup; - if (ret == 0) { - ret = qemuAgentCheckError(cmd, reply); - if (!(*result = virJSONValueToString(reply, false))) - ret = -1; - } + if (!(*result = virJSONValueToString(reply, false))) + ret = -1; + +cleanup: virJSONValueFree(cmd); virJSONValueFree(reply); return ret; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 5ca0fd4a1e..9d3f632726 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -14881,16 +14881,12 @@ qemuDomainQemuAgentCommand(virDomainPtr domain, qemuDomainObjEnterAgent(vm); ret = qemuAgentArbitraryCommand(priv->agent, cmd, &result, timeout); qemuDomainObjExitAgent(vm); - if (ret < 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", - _("Failed to execute agent command")); - goto endjob; - } + if (ret < 0) + VIR_FREE(result); endjob: - if (qemuDomainObjEndJob(driver, vm) == 0) { + if (qemuDomainObjEndJob(driver, vm) == 0) vm = NULL; - } cleanup: if (vm)