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: Wen Congyang <wency@cn.fujitsu.com>
This commit is contained in:
Wen Congyang 2011-03-30 09:48:29 +08:00
parent cc2424fc65
commit 0ecfa7f2e1
2 changed files with 18 additions and 2 deletions

View File

@ -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;
}

View File

@ -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);