]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu_capabilities: Stop QEMU process before freeing
authorChris Venteicher <cventeic@redhat.com>
Sun, 13 Jan 2019 00:50:05 +0000 (18:50 -0600)
committerJiri Denemark <jdenemar@redhat.com>
Tue, 19 Feb 2019 17:41:23 +0000 (18:41 +0100)
virQEMUCapsInitQMP now stops QEMU process in all execution paths,
before freeing the process structure.

The qemuProcessQMPStop function can be called multiple times without
problems... Won't attempt to stop processes and free resources multiple
times.

Follow the convention established in qemu_process of
1) alloc process structure
2) start process
3) use process
4) stop process
5) free process data structure

The process data structure persists after the process activation fails
or the process dies or is killed so stderr strings can be retrieved
until the process data structure is freed.

Signed-off-by: Chris Venteicher <cventeic@redhat.com>
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_process.c

index d187e35a3898ffbc10058fa9cf26a064533e8bc8..f578d4a5aeea4e8884bbd0ed4038b2f48ee0f553 100644 (file)
@@ -4393,6 +4393,7 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
     ret = 0;
 
  cleanup:
+    qemuProcessQMPStop(proc);
     qemuProcessQMPFree(proc);
     return ret;
 }
index d463a41ca0a410e63e282e12413e5976516cc643..4ae2067782ea5d563619c61b2f5dd45f96218654 100644 (file)
@@ -8488,14 +8488,20 @@ qemuProcessQMPRun(qemuProcessQMPPtr proc,
 void
 qemuProcessQMPStop(qemuProcessQMPPtr proc)
 {
-    if (proc->mon)
+    if (!proc)
+        return;
+
+    if (proc->mon) {
         virObjectUnlock(proc->mon);
-    qemuMonitorClose(proc->mon);
-    proc->mon = NULL;
+        qemuMonitorClose(proc->mon);
+        proc->mon = NULL;
+    }
 
-    virCommandAbort(proc->cmd);
-    virCommandFree(proc->cmd);
-    proc->cmd = NULL;
+    if (proc->cmd) {
+        virCommandAbort(proc->cmd);
+        virCommandFree(proc->cmd);
+        proc->cmd = NULL;
+    }
 
     if (proc->monpath)
         unlink(proc->monpath);
@@ -8512,8 +8518,10 @@ qemuProcessQMPStop(qemuProcessQMPPtr proc)
                       virStrerror(errno, ebuf, sizeof(ebuf)));
 
         VIR_FREE(*proc->qmperr);
+
+        proc->pid = 0;
     }
+
     if (proc->pidfile)
         unlink(proc->pidfile);
-    proc->pid = 0;
 }