render / rpms / libvirt

Forked from rpms/libvirt 10 months ago
Clone
7a3408
From e8ffa273684efa5de18fad0913d6da4a93a9682d Mon Sep 17 00:00:00 2001
7a3408
Message-Id: <e8ffa273684efa5de18fad0913d6da4a93a9682d@dist-git>
7a3408
From: Martin Kletzander <mkletzan@redhat.com>
7a3408
Date: Thu, 13 Aug 2015 15:11:45 +0200
7a3408
Subject: [PATCH] qemu: Fix segfault when parsing private domain data
7a3408
7a3408
https://bugzilla.redhat.com/show_bug.cgi?id=1162947
7a3408
7a3408
When parsing private domain data, there are two paths that are flawed.
7a3408
They are both error paths, just from different parts of the function.
7a3408
One of them can call free() on an uninitialized pointer.  Initialization
7a3408
to NULL is enough here.  The other one is a bit trickier to explain, but
7a3408
as easy as the first one to fix.  We create capabilities, parse them and
7a3408
then assign them into the private data pointer inside the domain object.
7a3408
If, however, we get to fail from now on, the error path calls unrefs the
7a3408
capabilities and then, when the domain object is being cleaned,
7a3408
qemuDomainObjPrivateFree() tries to unref them as well.  That causes a
7a3408
segfault.  Settin the pointer to NULL upon successful addition to the
7a3408
private data is enough.
7a3408
7a3408
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
7a3408
(cherry picked from commit 92ddffdbd3c91d99f8f7ed9b661388a2c5d36cc2)
7a3408
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
7a3408
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
7a3408
---
7a3408
 src/qemu/qemu_domain.c | 3 ++-
7a3408
 1 file changed, 2 insertions(+), 1 deletion(-)
7a3408
7a3408
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
7a3408
index c247737..d95f24f 100644
7a3408
--- a/src/qemu/qemu_domain.c
7a3408
+++ b/src/qemu/qemu_domain.c
7a3408
@@ -627,7 +627,7 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
7a3408
 {
7a3408
     qemuDomainObjPrivatePtr priv = vm->privateData;
7a3408
     char *monitorpath;
7a3408
-    char *tmp;
7a3408
+    char *tmp = NULL;
7a3408
     int n;
7a3408
     size_t i;
7a3408
     xmlNodePtr *nodes = NULL;
7a3408
@@ -715,6 +715,7 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
7a3408
         }
7a3408
 
7a3408
         priv->qemuCaps = qemuCaps;
7a3408
+        qemuCaps = NULL;
7a3408
     }
7a3408
     VIR_FREE(nodes);
7a3408
 
7a3408
-- 
7a3408
2.5.0
7a3408