[Libvirt-cim] [PATCH 19/19] Coverity: Resolve ARRAY_VS_SINGLETON - get_dev_paths() and callers

John Ferlan jferlan at redhat.com
Thu May 16 14:57:54 UTC 2013


Resolve two instances (disk_fs_or_disk_or_logical_pool() and
disk_iscsi_pool()) of

(1) Event address_of:
    Taking address with "&pool->pool_info.disk.device_paths" yields a
    singleton pointer.
(2) Event callee_ptr_arith:
    Passing "&pool->pool_info.disk.device_paths" to function
    "get_dev_paths(CMPIInstance *, char ***, uint16_t *)" which uses
    it as an array. This might corrupt or misinterpret adjacent
    memory locations.

201             msg = get_dev_paths(inst,
202                                 &pool->pool_info.disk.device_paths,
203                                 &pool->pool_info.disk.device_paths_ct);

Resolve by changing get_dev_paths() to take "pool" as an address and then
expanding the variables within the code to the specific location
---
 src/Virt_ResourcePoolConfigurationService.c | 20 +++++++-------------
 1 file changed, 7 insertions(+), 13 deletions(-)

diff --git a/src/Virt_ResourcePoolConfigurationService.c b/src/Virt_ResourcePoolConfigurationService.c
index 0c0cc06..4775e01 100644
--- a/src/Virt_ResourcePoolConfigurationService.c
+++ b/src/Virt_ResourcePoolConfigurationService.c
@@ -154,8 +154,7 @@ static void init_disk_pool(struct virt_pool *pool)
 }
 
 static char *get_dev_paths(CMPIInstance *inst, 
-                           char ***path_list,
-                           uint16_t *count)
+                           struct virt_pool *pool)
 {
         CMPICount i;
         CMPICount ct;
@@ -170,11 +169,11 @@ static char *get_dev_paths(CMPIInstance *inst,
         if ((s.rc != CMPI_RC_OK) || (ct <= 0))
                 return "Unable to get DevicePaths array count";
 
-        *path_list = calloc(ct, sizeof(char *));
-        if (*path_list == NULL)
+        pool->pool_info.disk.device_paths = calloc(ct, sizeof(char *));
+        if (pool->pool_info.disk.device_paths == NULL)
                 return "Failed to alloc space for device paths";
 
-        *count = ct;
+        pool->pool_info.disk.device_paths_ct = ct;
 
         for (i = 0; i < ct; i++) {
                 const char *str = NULL;
@@ -187,7 +186,7 @@ static char *get_dev_paths(CMPIInstance *inst,
                 if (str == NULL)
                         return "Unable to get value of DevicePaths element";
 
-                *path_list[i] = strdup(str);
+                pool->pool_info.disk.device_paths[i] = strdup(str);
         }
 
         return NULL;
@@ -198,10 +197,7 @@ static const char *disk_fs_or_disk_or_logical_pool(CMPIInstance *inst,
 {
         const char *msg = NULL;
 
-        msg = get_dev_paths(inst, 
-                            &pool->pool_info.disk.device_paths, 
-                            &pool->pool_info.disk.device_paths_ct);
-
+        msg = get_dev_paths(inst, pool);
 
         /* Specifying a value for DevicePaths isn't mandatory for logical
            pool types.  */ 
@@ -243,9 +239,7 @@ static const char *disk_iscsi_pool(CMPIInstance *inst,
         const char *val = NULL;
         const char *msg = NULL;
 
-        msg = get_dev_paths(inst, 
-                            &pool->pool_info.disk.device_paths, 
-                            &pool->pool_info.disk.device_paths_ct);
+        msg = get_dev_paths(inst, pool);
         
         if (msg != NULL)
                 return msg;
-- 
1.8.1.4




More information about the Libvirt-cim mailing list