As written in virStorageFileGetMetadataFromFD decription, caller
must free metadata after use. Qemu driver miss this and therefore
leak metadata which can grow to huge mem leak if somebody query
for blockInfo a lot.
---
src/qemu/qemu_driver.c | 14 ++++++++++----
1 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 0f91910..d45c7c5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6949,7 +6949,7 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
int ret = -1;
int fd = -1;
off_t end;
- virStorageFileMetadata meta;
+ virStorageFileMetadata *meta = NULL;
virDomainDiskDefPtr disk = NULL;
struct stat sb;
int i;
@@ -7017,9 +7017,14 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
}
}
+ if (VIR_ALLOC(meta) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
if (virStorageFileGetMetadataFromFD(path, fd,
format,
- &meta) < 0)
+ meta) < 0)
goto cleanup;
/* Get info for normal formats */
@@ -7056,8 +7061,8 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
/* If the file we probed has a capacity set, then override
* what we calculated from file/block extents */
- if (meta.capacity)
- info->capacity = meta.capacity;
+ if (meta->capacity)
+ info->capacity = meta->capacity;
/* Set default value .. */
info->allocation = info->physical;
@@ -7091,6 +7096,7 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom,
}
cleanup:
+ virStorageFileFreeMetadata(meta);
VIR_FORCE_CLOSE(fd);
if (vm)
virDomainObjUnlock(vm);
--
1.7.5.rc3