From: Jiri Denemark Date: Tue, 4 Sep 2012 10:01:43 +0000 (+0200) Subject: qemu: Fix reboot with guest agent X-Git-Tag: CVE-2012-4423~118 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=03c42a4510f3232cb85c673f7f02208d56169eca;p=thirdparty%2Flibvirt.git qemu: Fix reboot with guest agent When reboot using qemu guest agent was requested, qemu driver kept waiting for SHUTDOWN event from qemu. However, such event is never emitted during guest reboot and qemu driver would keep waiting forever. --- diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c index 51e60d21e3..804c424ca0 100644 --- a/src/qemu/qemu_agent.c +++ b/src/qemu/qemu_agent.c @@ -1294,7 +1294,10 @@ int qemuAgentShutdown(qemuAgentPtr mon, if (!cmd) return -1; - mon->await_event = QEMU_AGENT_EVENT_SHUTDOWN; + if (mode == QEMU_AGENT_SHUTDOWN_REBOOT) + mon->await_event = QEMU_AGENT_EVENT_RESET; + else + mon->await_event = QEMU_AGENT_EVENT_SHUTDOWN; ret = qemuAgentCommand(mon, cmd, &reply, VIR_DOMAIN_QEMU_AGENT_COMMAND_BLOCK); diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h index 528fee12e4..18740ba6a5 100644 --- a/src/qemu/qemu_agent.h +++ b/src/qemu/qemu_agent.h @@ -55,7 +55,8 @@ void qemuAgentClose(qemuAgentPtr mon); typedef enum { QEMU_AGENT_EVENT_NONE = 0, QEMU_AGENT_EVENT_SHUTDOWN, - QEMU_AGENT_EVENT_SUSPEND + QEMU_AGENT_EVENT_SUSPEND, + QEMU_AGENT_EVENT_RESET, } qemuAgentEvent; void qemuAgentNotifyEvent(qemuAgentPtr mon, diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 5c3b89ebe2..93653c6da8 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -511,9 +511,15 @@ qemuProcessHandleReset(qemuMonitorPtr mon ATTRIBUTE_UNUSED, { struct qemud_driver *driver = qemu_driver; virDomainEventPtr event; + qemuDomainObjPrivatePtr priv; virDomainObjLock(vm); + event = virDomainEventRebootNewFromObj(vm); + priv = vm->privateData; + if (priv->agent) + qemuAgentNotifyEvent(priv->agent, QEMU_AGENT_EVENT_RESET); + virDomainObjUnlock(vm); if (event) {