Blame SOURCES/libvirt-util-storage-Don-t-leak-metadata-on-repeated-calls-of-virStorageFileGetMetadata.patch

d759b5
From 46fe53ae905497a84d33065a9d8c31c9cd0c44bf Mon Sep 17 00:00:00 2001
d759b5
Message-Id: <46fe53ae905497a84d33065a9d8c31c9cd0c44bf@dist-git>
d759b5
From: Peter Krempa <pkrempa@redhat.com>
d759b5
Date: Fri, 19 Jul 2019 15:34:53 +0200
d759b5
Subject: [PATCH] util: storage: Don't leak metadata on repeated calls of
d759b5
 virStorageFileGetMetadata
d759b5
MIME-Version: 1.0
d759b5
Content-Type: text/plain; charset=UTF-8
d759b5
Content-Transfer-Encoding: 8bit
d759b5
d759b5
When querying storage metadata after a block job we re-run
d759b5
virStorageFileGetMetadata on the top level storage file. This means that
d759b5
the workers (virStorageFileGetMetadataInternal) must not overwrite any
d759b5
pointers without freeing them.
d759b5
d759b5
This was not considered for src->compat and src->features. Fix it and
d759b5
add a comment mentioning that.
d759b5
d759b5
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
d759b5
Reviewed-by: Ján Tomko <jtomko@redhat.com>
d759b5
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
d759b5
(cherry picked from commit f0430d069af991475de6fa83ed62a45f8669c645)
d759b5
https: //bugzilla.redhat.com/show_bug.cgi?id=1731329
d759b5
Message-Id: <80801e221bea1a4e33fbdd62845d790e390a1632.1563542241.git.pkrempa@redhat.com>
d759b5
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
d759b5
---
d759b5
 src/util/virstoragefile.c | 9 ++++++++-
d759b5
 1 file changed, 8 insertions(+), 1 deletion(-)
d759b5
d759b5
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
d759b5
index f516a7c7f3..0187c8d2c9 100644
d759b5
--- a/src/util/virstoragefile.c
d759b5
+++ b/src/util/virstoragefile.c
d759b5
@@ -961,7 +961,11 @@ virStorageFileGetEncryptionPayloadOffset(const struct FileEncryptionInfo *info,
d759b5
  * assuming it has the given FORMAT, populate information into META
d759b5
  * with information about the file and its backing store. Return format
d759b5
  * of the backing store as BACKING_FORMAT. PATH and FORMAT have to be
d759b5
- * pre-populated in META */
d759b5
+ * pre-populated in META.
d759b5
+ *
d759b5
+ * Note that this function may be called repeatedly on @meta, so it must
d759b5
+ * clean up any existing allocated memory which would be overwritten.
d759b5
+ */
d759b5
 int
d759b5
 virStorageFileGetMetadataInternal(virStorageSourcePtr meta,
d759b5
                                   char *buf,
d759b5
@@ -1048,10 +1052,13 @@ virStorageFileGetMetadataInternal(virStorageSourcePtr meta,
d759b5
             return -1;
d759b5
     }
d759b5
 
d759b5
+    virBitmapFree(meta->features);
d759b5
+    meta->features = NULL;
d759b5
     if (fileTypeInfo[meta->format].getFeatures != NULL &&
d759b5
         fileTypeInfo[meta->format].getFeatures(&meta->features, meta->format, buf, len) < 0)
d759b5
         return -1;
d759b5
 
d759b5
+    VIR_FREE(meta->compat);
d759b5
     if (meta->format == VIR_STORAGE_FILE_QCOW2 && meta->features &&
d759b5
         VIR_STRDUP(meta->compat, "1.1") < 0)
d759b5
         return -1;
d759b5
-- 
d759b5
2.22.1
d759b5