File libvirt-blockjob-avoid-segv-on-early-error.patch of Package libvirt

From 17b267b662e3149d85ad7038ab3a7157e1722ce6 Mon Sep 17 00:00:00 2001
Message-Id: <17b267b662e3149d85ad7038ab3a7157e1722ce6.1350990679.git.jdenemar@redhat.com>
From: Eric Blake <eblake@redhat.com>
Date: Fri, 19 Oct 2012 21:54:46 -0600
Subject: [PATCH] blockjob: avoid segv on early error

https://bugzilla.redhat.com/show_bug.cgi?id=772088

Gcc with optimization warns:
../../src/qemu/qemu_driver.c: In function 'qemuDomainBlockCommit':
../../src/qemu/qemu_driver.c:12813:46: error: 'disk' may be used uninitialized in this function [-Werror=maybe-uninitialized]
../../src/qemu/qemu_driver.c:12698:25: note: 'disk' was declared here
cc1: all warnings being treated as errors

so obviously I had only been testing with optimization off.

* src/qemu/qemu_driver.c (qemuDomainBlockCommit): Guard cleanup.
(cherry picked from commit a172dfbe2e70897ed3f56cdee5d24d7c897be13d)
---
 src/qemu/qemu_driver.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a1dcfa9..4ef67cb 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12691,12 +12691,13 @@ qemuDomainBlockCommit(virDomainPtr dom, const char *path, const char *base,
     char *device = NULL;
     int ret = -1;
     int idx;
-    virDomainDiskDefPtr disk;
+    virDomainDiskDefPtr disk = NULL;
     const char *top_canon = NULL;
     virStorageFileMetadataPtr top_meta = NULL;
     const char *top_parent = NULL;
     const char *base_canon = NULL;
     virCgroupPtr cgroup = NULL;
+    bool clean_access = false;
 
     virCheckFlags(VIR_DOMAIN_BLOCK_COMMIT_SHALLOW, -1);
 
@@ -12786,6 +12787,7 @@ qemuDomainBlockCommit(virDomainPtr dom, const char *path, const char *base,
                        vm->def->name);
         goto endjob;
     }
+    clean_access = true;
     if (qemuDomainPrepareDiskChainElement(driver, vm, cgroup, disk, base_canon,
                                           VIR_DISK_CHAIN_READ_WRITE) < 0 ||
         (top_parent && top_parent != disk->src &&
@@ -12801,7 +12803,7 @@ qemuDomainBlockCommit(virDomainPtr dom, const char *path, const char *base,
     qemuDomainObjExitMonitor(driver, vm);
 
 endjob:
-    if (ret < 0) {
+    if (ret < 0 && clean_access) {
         /* Revert access to read-only, if possible.  */
         qemuDomainPrepareDiskChainElement(driver, vm, cgroup, disk, base_canon,
                                           VIR_DISK_CHAIN_READ_ONLY);
-- 
1.7.12.4

openSUSE Build Service is sponsored by