[libvirt] [PATCH 2/2] check whether qemuMonitorJSONHMP() failed

Wen Congyang wency at cn.fujitsu.com
Tue Mar 29 09:48:48 UTC 2011


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 at cn.fujitsu.com>

---
 src/qemu/qemu_monitor.c      |    9 ++++++++-
 src/qemu/qemu_monitor_json.c |    9 ++++++++-
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index eed83f4..647e2bb 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -906,7 +906,14 @@ int qemuMonitorSetCapabilities(qemuMonitorPtr mon)
 
     if (mon->json) {
         ret = qemuMonitorJSONSetCapabilities(mon);
-        mon->json_hmp = qemuMonitorJSONCheckHMP(mon);
+        if (ret == 0) {
+            mon->json_hmp = qemuMonitorJSONCheckHMP(mon);
+            if (mon->json_hmp < 0) {
+                /* qemu may quited unexpectedly when we call
+                 * qemuMonitorJSONCheckHMP() */
+                ret = -1;
+            }
+        }
     } else {
         ret = 0;
     }
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 6bd03d6..20a78e1 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -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);
-- 
1.7.1




More information about the libvir-list mailing list