If qemu quited unexpectedly when we call qemuMonitorJSONHMP(),
libvirt will crash.
Steps to reproduce this bug:
1. use gdb to attach libvirtd, and set a breakpoint in the function
qemuMonitorSetCapabilities()
2. start a vm
3. let the libvirtd to run until qemuMonitorJSONSetCapabilities() returns.
4. kill the qemu process
5. continue running libvirtd
Signed-off-by: Wen Congyang <wency@cn.fujitsu.com>
if (mon->json) {
ret = qemuMonitorJSONSetCapabilities(mon);
- mon->json_hmp = qemuMonitorJSONCheckHMP(mon);
+ if (ret == 0) {
+ int hmp = qemuMonitorJSONCheckHMP(mon);
+ if (hmp < 0) {
+ /* qemu may quited unexpectedly when we call
+ * qemuMonitorJSONCheckHMP() */
+ ret = -1;
+ } else {
+ mon->json_hmp = hmp > 0;
+ }
+ }
} else {
ret = 0;
}
}
+/*
+ * Returns: 0 if human-monitor-command is not supported, +1 if
+ * human-monitor-command worked or -1 on failure
+ */
int
qemuMonitorJSONCheckHMP(qemuMonitorPtr mon)
{
- int ret = 0;
+ int ret = -1;
virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("query-commands", NULL);
virJSONValuePtr reply = NULL;
virJSONValuePtr data;
}
}
+ /* human-monitor-command is not supported */
+ ret = 0;
+
cleanup:
virJSONValueFree(cmd);
virJSONValueFree(reply);