From d75cae45933638648d772a5e5f140017b83c019c Mon Sep 17 00:00:00 2001
From: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Date: Mon, 14 Oct 2013 17:29:44 +0200
Subject: [PATCH 29/60] VSMS: Improve device cleanup

Use cleanup_virt_device instead of single free's all over
the place in net_rasd_to_vdev and disk_rasd_to_vdev.
Further, make sure that the device type is always set
independent of the implementation of the xxx_rasd_to_vdev
functions.

Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
Signed-off-by: John Ferlan <jferlan@redhat.com>
---
 src/Virt_VirtualSystemManagementService.c | 35 +++++++------------------------
 1 file changed, 8 insertions(+), 27 deletions(-)

diff --git a/src/Virt_VirtualSystemManagementService.c b/src/Virt_VirtualSystemManagementService.c
index b813be6..6548d08 100644
--- a/src/Virt_VirtualSystemManagementService.c
+++ b/src/Virt_VirtualSystemManagementService.c
@@ -964,17 +964,15 @@ static const char *net_rasd_to_vdev(CMPIInstance *inst,
         }
 */

-        free(dev->dev.net.mac);
+        cleanup_virt_device(dev);
+
         dev->dev.net.mac = strdup(val);

-        free(dev->id);
         dev->id = strdup(dev->dev.net.mac);

-        free(dev->dev.net.type);
         if (cu_get_str_prop(inst, "NetworkType", &val) != CMPI_RC_OK)
                 return "No Network Type specified";

-        free(dev->dev.net.source);
         if (STREQC(val, BRIDGE_TYPE)) {
                 dev->dev.net.type = strdup(BRIDGE_TYPE);
                 if (cu_get_str_prop(inst, "NetworkName", &val) == CMPI_RC_OK)
@@ -1011,44 +1009,37 @@ static const char *net_rasd_to_vdev(CMPIInstance *inst,
                 else
                         return "No Source Device specified";

-                free(dev->dev.net.vsi.vsi_type);
                 if (cu_get_str_prop(inst, "VSIType", &val) != CMPI_RC_OK)
                         dev->dev.net.vsi.vsi_type = NULL;
                 else
                         dev->dev.net.vsi.vsi_type = strdup(val);

-                free(dev->dev.net.vsi.manager_id);
                 if (cu_get_str_prop(inst, "VSIManagerID", &val) != CMPI_RC_OK)
                         dev->dev.net.vsi.manager_id = NULL;
                 else
                         dev->dev.net.vsi.manager_id = strdup(val);

-                free(dev->dev.net.vsi.type_id);
                 if (cu_get_str_prop(inst, "VSITypeID", &val) != CMPI_RC_OK)
                         dev->dev.net.vsi.type_id = NULL;
                 else
                         dev->dev.net.vsi.type_id = strdup(val);

-                free(dev->dev.net.vsi.type_id_version);
                 if (cu_get_str_prop(inst, "VSITypeIDVersion", &val) !=
                     CMPI_RC_OK)
                         dev->dev.net.vsi.type_id_version = NULL;
                 else
                         dev->dev.net.vsi.type_id_version = strdup(val);

-                free(dev->dev.net.vsi.instance_id);
                 if (cu_get_str_prop(inst, "VSIInstanceID", &val) != CMPI_RC_OK)
                         dev->dev.net.vsi.instance_id = NULL;
                 else
                         dev->dev.net.vsi.instance_id = strdup(val);

-                free(dev->dev.net.vsi.filter_ref);
                 if (cu_get_str_prop(inst, "FilterRef", &val) != CMPI_RC_OK)
                         dev->dev.net.vsi.filter_ref = NULL;
                 else
                         dev->dev.net.vsi.filter_ref = strdup(val);

-                free(dev->dev.net.vsi.profile_id);
                 if (cu_get_str_prop(inst, "ProfileID", &val) != CMPI_RC_OK)
                         dev->dev.net.vsi.profile_id = NULL;
                 else
@@ -1057,20 +1048,16 @@ static const char *net_rasd_to_vdev(CMPIInstance *inst,
         } else
                 return "Invalid Network Type specified";

-        free(dev->dev.net.device);
         if (cu_get_str_prop(inst, "VirtualDevice", &val) != CMPI_RC_OK)
                 dev->dev.net.device = NULL;
         else
                 dev->dev.net.device = strdup(val);

-        free(dev->dev.net.net_mode);
         if (cu_get_str_prop(inst, "NetworkMode", &val) != CMPI_RC_OK)
                 dev->dev.net.net_mode = NULL;
         else
                 dev->dev.net.net_mode = strdup(val);

-        free(dev->dev.net.model);
-
         if (cu_get_str_prop(inst, "ResourceSubType", &val) != CMPI_RC_OK)
                 dev->dev.net.model = NULL;
         else
@@ -1106,13 +1093,13 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
         if (cu_get_str_prop(inst, "VirtualDevice", &val) != CMPI_RC_OK)
                 return "Missing `VirtualDevice' property";

-        free(dev->dev.disk.virtual_dev);
+        cleanup_virt_device(dev);
+
         dev->dev.disk.virtual_dev = strdup(val);

         if (cu_get_str_prop(inst, "Address", &val) != CMPI_RC_OK)
                 val = "/dev/null";

-        free(dev->dev.disk.source);
         dev->dev.disk.source = strdup(val);
         if (dev->dev.disk.source == NULL) {
                 return "dev->dev.disk.source is null!";
@@ -1149,7 +1136,6 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
                 }
                 if (XSTREQ(dev->dev.disk.source, "/dev/null")) {
                         dev->dev.disk.disk_type = DISK_FILE;
-                        free(dev->dev.disk.source);
                         dev->dev.disk.source = strdup("");
                 }

@@ -1170,31 +1156,26 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
         else
                 dev->dev.disk.readonly = read;

-        free(dev->dev.disk.bus_type);
         if (cu_get_str_prop(inst, "BusType", &val) != CMPI_RC_OK)
                 dev->dev.disk.bus_type = NULL;
         else
                 dev->dev.disk.bus_type = strdup(val);

-        free(dev->dev.disk.driver);
         if (cu_get_str_prop(inst, "DriverName", &val) != CMPI_RC_OK)
                 dev->dev.disk.driver = NULL;
         else
                 dev->dev.disk.driver = strdup(val);

-        free(dev->dev.disk.driver_type);
         if (cu_get_str_prop(inst, "DriverType", &val) != CMPI_RC_OK)
                 dev->dev.disk.driver_type = NULL;
         else
                 dev->dev.disk.driver_type = strdup(val);

-        free(dev->dev.disk.cache);
         if (cu_get_str_prop(inst, "DriverCache", &val) != CMPI_RC_OK)
                 dev->dev.disk.cache = NULL;
         else
                 dev->dev.disk.cache = strdup(val);

-        free(dev->dev.disk.access_mode);
         if (cu_get_str_prop(inst, "AccessMode", &val) != CMPI_RC_OK)
                 dev->dev.disk.access_mode = NULL;
         else
@@ -1205,7 +1186,6 @@ static const char *disk_rasd_to_vdev(CMPIInstance *inst,
         else
                 dev->dev.disk.shareable = shareable;

-        free(dev->id);
         dev->id = strdup(dev->dev.disk.virtual_dev);

         msg = rasd_to_device_address(inst, &dev->dev.disk.address);
@@ -1921,12 +1901,14 @@ static const char *rasd_to_vdev(CMPIInstance *inst,
                 goto out;
         }

-        dev->type = (int)type;
-
         if (domain->type == DOMAIN_LXC)
                 msg = _container_rasd_to_vdev(inst, dev, type, ns);
         else
                 msg = _sysvirt_rasd_to_vdev(inst, dev, type, ns, p_error);
+
+        /* ensure device type is set */
+        if (msg == NULL)
+                dev->type = type;
  out:
         if (msg && op)
                 CU_DEBUG("rasd_to_vdev(%s): %s", CLASSNAME(op), msg);
@@ -3112,7 +3094,6 @@ static CMPIStatus resource_add(struct domain *dominfo,

         dev = &list[*count];

-        dev->type = type;
         msg = rasd_to_vdev(rasd, dominfo, dev, ns, &error_msg);
         if (msg != NULL) {
                 cu_statusf(_BROKER, &s,
--
2.1.0
