提交 0ecfa7f2 编写于 作者: W Wen Congyang

check whether qemuMonitorJSONHMP() failed

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: NWen Congyang <wency@cn.fujitsu.com>
上级 cc2424fc
......@@ -908,7 +908,16 @@ int qemuMonitorSetCapabilities(qemuMonitorPtr mon)
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;
}
......
......@@ -746,10 +746,14 @@ qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon)
}
/*
* 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;
......@@ -781,6 +785,9 @@ qemuMonitorJSONCheckHMP(qemuMonitorPtr mon)
}
}
/* human-monitor-command is not supported */
ret = 0;
cleanup:
virJSONValueFree(cmd);
virJSONValueFree(reply);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册