From 09d7eba99d95b887bd284b3418ea21438f6af277 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Thu, 28 Jul 2011 15:42:57 +0200 Subject: [PATCH] qemu: Fix memory leak on metadata fetching 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 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 0f9191023c..d45c7c56ac 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);