# HG changeset patch
# User Kaitlin Rupert <karupert(a)us.ibm.com>
# Date 1256568468 25200
# Node ID 71465d8204cafbd92f63a1bb2f998b4df73fc156
# Parent a5cfc77fe35238cf4e17f4d09fcd09633f6f3149
Fix misc memory and libvirt connection leaks
ElementConformsToProfile - leaking classname in elem_to_prof()
ResourcePoolConfigurationCapabilities - potiential libvirt connection leak in
get_rpc_cap()
VSMigrationCapabilities - potiential libvirt connection leak in
get_migration_caps()
misc_util.c - no need to get a new connection pointer - use existing one
Virt_VirtualSystemManagementService.c - after the call to virDomainDestroy(),
we look up the guest and get a new
domain pointer. We do this without
freeing the previous pointer.
pool_parsing.c - reorganize function so that storage pool pointer isn't leaked
in the case that the storage volume pointer is NULL.
Virt_KVMRedirectionSAP.c - use free_domain_list() to free all domain pointers
before exiting function instead of trying to free
each one in the loop (which can cause a leak if an
error occurs and the loop exits before freeing).
Also, be sure to clean up the dominfo struct before
exiting the loop.
Signed-off-by: Kaitlin Rupert <karupert(a)us.ibm.com>
diff -r a5cfc77fe352 -r 71465d8204ca libxkutil/misc_util.c
--- a/libxkutil/misc_util.c Fri Oct 30 05:11:06 2009 -0700
+++ b/libxkutil/misc_util.c Mon Oct 26 07:47:48 2009 -0700
@@ -417,8 +417,7 @@
compare_flags = 2;
}
- _dom = virDomainLookupByName(virDomainGetConnect(dom),
- virDomainGetName(dom));
+ _dom = virDomainLookupByName(conn, virDomainGetName(dom));
if (_dom == NULL) {
CU_DEBUG("Unable to re-lookup domain");
goto out;
diff -r a5cfc77fe352 -r 71465d8204ca libxkutil/pool_parsing.c
--- a/libxkutil/pool_parsing.c Fri Oct 30 05:11:06 2009 -0700
+++ b/libxkutil/pool_parsing.c Mon Oct 26 07:47:48 2009 -0700
@@ -336,25 +336,29 @@
int res_type)
{
int ret = 0;
+ virStoragePoolPtr ptr = NULL;
+ virStorageVolPtr vptr = NULL;
if (res_type == CIM_RES_TYPE_IMAGE) {
- virStoragePoolPtr ptr = virStoragePoolLookupByName(conn, pname);
+ ptr = virStoragePoolLookupByName(conn, pname);
if (ptr == NULL) {
CU_DEBUG("Storage pool %s is not defined", pname);
goto out;
}
- virStorageVolPtr vptr = virStorageVolCreateXML(ptr, xml, 0);
- if (vptr == NULL)
+ vptr = virStorageVolCreateXML(ptr, xml, 0);
+ if (vptr == NULL) {
+ CU_DEBUG("Unable to create storage volume in %s",
+ pname);
goto out;
-
- virStorageVolFree(vptr);
- virStoragePoolFree(ptr);
+ }
ret = 1;
}
out:
+ virStoragePoolFree(ptr);
+ virStorageVolFree(vptr);
return ret;
}
diff -r a5cfc77fe352 -r 71465d8204ca src/Virt_ElementConformsToProfile.c
--- a/src/Virt_ElementConformsToProfile.c Fri Oct 30 05:11:06 2009 -0700
+++ b/src/Virt_ElementConformsToProfile.c Mon Oct 26 07:47:48 2009 -0700
@@ -199,7 +199,7 @@
conn = connect_by_classname(_BROKER, CLASSNAME(vref), &s);
if (conn == NULL)
- return s;
+ goto out;
for (i = 0; profiles[i] != NULL; i++) {
diff -r a5cfc77fe352 -r 71465d8204ca src/Virt_KVMRedirectionSAP.c
--- a/src/Virt_KVMRedirectionSAP.c Fri Oct 30 05:11:06 2009 -0700
+++ b/src/Virt_KVMRedirectionSAP.c Mon Oct 26 07:47:48 2009 -0700
@@ -316,7 +316,6 @@
for (i = 0; i < count; i++) {
if (!check_graphics(domain_list[i], &dominfo)) {
- virDomainFree(domain_list[i]);
cleanup_dominfo(&dominfo);
continue;
}
@@ -328,6 +327,7 @@
cu_statusf(broker, &s,
CMPI_RC_ERR_FAILED,
"Unable to guest's console port");
+ cleanup_dominfo(&dominfo);
goto out;
}
@@ -336,6 +336,7 @@
cu_statusf(broker, &s,
CMPI_RC_ERR_FAILED,
"Unable to allocate string");
+ cleanup_dominfo(&dominfo);
goto out;
}
@@ -343,7 +344,6 @@
port_list.list[port_list.cur]->remote_port = -1;
port_list.cur++;
- virDomainFree(domain_list[i]);
cleanup_dominfo(&dominfo);
}
@@ -355,6 +355,7 @@
goto out;
out:
+ free_domain_list(domain_list, count);
free(domain_list);
for (i = 0; i < count; i++) {
diff -r a5cfc77fe352 -r 71465d8204ca src/Virt_ResourcePoolConfigurationCapabilities.c
--- a/src/Virt_ResourcePoolConfigurationCapabilities.c Fri Oct 30 05:11:06 2009 -0700
+++ b/src/Virt_ResourcePoolConfigurationCapabilities.c Mon Oct 26 07:47:48 2009 -0700
@@ -70,17 +70,23 @@
pfx_from_conn(conn),
"ResourcePoolConfigurationCapabilities",
NAMESPACE(reference));
- if (inst == NULL)
+ if (inst == NULL) {
cu_statusf(_BROKER, &s,
CMPI_RC_ERR_FAILED,
- "Can't create ResourcePoolConfigurationCapabilities
instance");
+ "Can't create RPCC instance");
+ goto out;
+ }
CMSetProperty(inst, "InstanceID",
(CMPIValue *)"RPCC", CMPI_chars);
array = CMNewArray(_BROKER, 2, CMPI_uint32, &s);
- if (s.rc != CMPI_RC_OK)
- return s;
+ if (s.rc != CMPI_RC_OK) {
+ cu_statusf(_BROKER, &s,
+ CMPI_RC_ERR_FAILED,
+ "Can't create new CMPI array to store values");
+ goto out;
+ }
val = CreateChildResourcePool;
CMSetArrayElementAt(array, 0, (CMPIValue *)&val, CMPI_uint32);
diff -r a5cfc77fe352 -r 71465d8204ca src/Virt_VSMigrationCapabilities.c
--- a/src/Virt_VSMigrationCapabilities.c Fri Oct 30 05:11:06 2009 -0700
+++ b/src/Virt_VSMigrationCapabilities.c Mon Oct 26 07:47:48 2009 -0700
@@ -139,7 +139,7 @@
cu_statusf(broker, &s,
CMPI_RC_ERR_FAILED,
"Unable to get instance for %s", CLASSNAME(ref));
- return s;
+ goto out;
}
CMSetProperty(inst, "InstanceID",
diff -r a5cfc77fe352 -r 71465d8204ca src/Virt_VirtualSystemManagementService.c
--- a/src/Virt_VirtualSystemManagementService.c Fri Oct 30 05:11:06 2009 -0700
+++ b/src/Virt_VirtualSystemManagementService.c Mon Oct 26 07:47:48 2009 -0700
@@ -1695,6 +1695,8 @@
virDomainDestroy(dom); /* Okay for this to fail */
+ virDomainFree(dom);
+
dom = virDomainLookupByName(conn, dom_name);
if (dom == NULL) {
CU_DEBUG("Domain successfully destroyed");